Zum Inhalt springen

Fehler

Strukturierte Fehlerbehandlung mit Kategorisierung und Retry-Metadaten. Die globale errors-Tabelle ist ohne require verfügbar.

-- Einfache Nachricht (Art standardmäßig UNKNOWN)
local err = errors.new("something went wrong")
-- Mit Art, retryable und Details
local err = errors.new({
message = "user not found",
kind = errors.NOT_FOUND,
retryable = false,
details = {user_id = 123}
})

errors.new akzeptiert entweder eine String-Nachricht oder eine Tabelle mit mindestens einem message-Feld. Die Form (kind, message) wird nicht unterstützt.

Kontext hinzufügen und dabei Art, retryable und Details beibehalten:

local data, err = db.query("SELECT * FROM users")
if err then
return nil, errors.wrap(err, "failed to load users")
end
MethodeGibt zurückBeschreibung
err:kind()stringFehlerkategorie
err:message()stringFehlermeldung
err:retryable()boolean/nilOb die Operation wiederholt werden kann
err:details()table/nilStrukturierte Metadaten
err:stack()stringLua-Stack-Trace
tostring(err)stringVollständige Darstellung
if errors.is(err, errors.INVALID) then
-- ungültige Eingabe behandeln
end
-- Oder direkt vergleichen
if err:kind() == errors.NOT_FOUND then
-- fehlende Ressource behandeln
end
KonstanteAnwendungsfall
errors.NOT_FOUNDRessource existiert nicht
errors.ALREADY_EXISTSRessource existiert bereits
errors.INVALIDUngültige Eingabe oder Argumente
errors.PERMISSION_DENIEDZugriff verweigert
errors.UNAVAILABLEService vorübergehend nicht verfügbar
errors.INTERNALInterner Fehler
errors.CANCELEDOperation wurde abgebrochen
errors.CONFLICTRessourcenzustandskonflikt
errors.TIMEOUTOperation hat Zeitlimit überschritten
errors.RATE_LIMITEDZu viele Anfragen
errors.UNKNOWNNicht spezifizierter Fehler

Strukturierten Aufrufstack abrufen:

local stack = errors.call_stack(err)
if stack then
print("Thread:", stack.thread)
for _, frame in ipairs(stack.frames) do
print(frame.source .. ":" .. frame.line, frame.name)
end
end
Typischerweise wiederholbarNicht wiederholbar
TIMEOUTINVALID
UNAVAILABLENOT_FOUND
RATE_LIMITEDPERMISSION_DENIED
ALREADY_EXISTS
if err:retryable() then
-- sicher zu wiederholen
end
local err = errors.new({
message = "validation failed",
kind = errors.INVALID,
details = {
errors = {
{field = "email", message = "invalid format"},
{field = "age", message = "must be positive"}
}
}
})
local details = err:details()
for _, e in ipairs(details.errors) do
print(e.field, e.message)
end