Gestionarea Erorilor și Excepțiilor în Lua: pcall, xpcall, error și debug.traceback în Lua

Ghid complet pentru tratarea erorilor în Lua: apeluri protejate cu pcall, capturarea stivei de apeluri cu xpcall și debug.traceback, și declanșarea erorilor cu error.

Sintaxă
local ok, res = pcall(func, arg); xpcall(func, errorHandler)

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.
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: Gestionarea Erorilor și Excepțiilor în Lua: pcall, xpcall, error și debug.traceback

Ai o nelămurire despre utilizarea comenzii Gestionarea Erorilor și Excepțiilor în Lua: pcall, xpcall, error și debug.traceback sau 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.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.