Lua nu are blocurile tradiționale try...catch...finally întâlnite în Java sau Python. În schimb, tratarea excepțiilor se realizează prin apeluri protejate (protected calls) folosind funcțiile native pcall și xpcall.
Tratarea erorilor cu pcall (Protected Call)
local function imparte(a, b)
if b == 0 then
error("Împărțirea la zero nu este permisă!")
end
return a / b
end
-- Apelul fără protecție ar întrerupe complet programul.
-- Cu pcall, execuția continuă în siguranță:
local succes, rezultat = pcall(imparte, 100, 2)
if succes then
print("Rezultat cu succes:", rezultat) -- 50
end
local succesEroare, mesajEroare = pcall(imparte, 100, 0)
if not succesEroare then
print("[Eroare Prinsă]:", mesajEroare)
-- Nu blochează serverul sau scriptul!
end
Capturarea completă a stivei de execuție cu xpcall și debug.traceback
local function functieCareCrapa()
local x = nil
return x.proprietateInexistenta -- eroare la runtime (indexare nil)
end
-- Funcție dedicată de capturare a erorii (Error Handler):
local function trateazaCuStiva(err)
return debug.traceback("CRASH: " .. tostring(err), 2)
end
-- xpcall execută funcția și invocă trateazaCuStiva în caz de eroare:
local ok, raportComplet = xpcall(functieCareCrapa, trateazaCuStiva)
if not ok then
print("=== Raport Detaliat de Eroare ===")
print(raportComplet)
end
Diferența critică dintre pcall și xpcall: La
pcall, stiva de execuție se derulează (unwinding) înainte de returnarea mesajului, pierzând contextul exact al liniei de cod. La xpcall, handlerul este apelat înainte de derularea stivei, permițând extragerea exactă a fișierelor și liniilor prin debug.traceback.
Întrebări & Exemple de Cod:
Gestionarea Erorilor și Excepțiilor în Lua: pcall, xpcall, error și debug.tracebackAi o nelămurire despre utilizarea comenzii
Gestionarea Erorilor și Excepțiilor în Lua: pcall, xpcall, error și debug.tracebacksau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.