Fehler
Strukturierte Fehlerbehandlung mit Kategorisierung und Retry-Metadaten. Die globale errors-Tabelle ist ohne require verfügbar.
Fehler erstellen
Abschnitt betitelt „Fehler erstellen“-- Einfache Nachricht (Art standardmäßig UNKNOWN)local err = errors.new("something went wrong")
-- Mit Art, retryable und Detailslocal 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.
Fehler wrappen
Abschnitt betitelt „Fehler wrappen“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")endFehlermethoden
Abschnitt betitelt „Fehlermethoden“| Methode | Gibt zurück | Beschreibung |
|---|---|---|
err:kind() | string | Fehlerkategorie |
err:message() | string | Fehlermeldung |
err:retryable() | boolean/nil | Ob die Operation wiederholt werden kann |
err:details() | table/nil | Strukturierte Metadaten |
err:stack() | string | Lua-Stack-Trace |
tostring(err) | string | Vollständige Darstellung |
Art prüfen
Abschnitt betitelt „Art prüfen“if errors.is(err, errors.INVALID) then -- ungültige Eingabe behandelnend
-- Oder direkt vergleichenif err:kind() == errors.NOT_FOUND then -- fehlende Ressource behandelnendFehlerarten
Abschnitt betitelt „Fehlerarten“| Konstante | Anwendungsfall |
|---|---|
errors.NOT_FOUND | Ressource existiert nicht |
errors.ALREADY_EXISTS | Ressource existiert bereits |
errors.INVALID | Ungültige Eingabe oder Argumente |
errors.PERMISSION_DENIED | Zugriff verweigert |
errors.UNAVAILABLE | Service vorübergehend nicht verfügbar |
errors.INTERNAL | Interner Fehler |
errors.CANCELED | Operation wurde abgebrochen |
errors.CONFLICT | Ressourcenzustandskonflikt |
errors.TIMEOUT | Operation hat Zeitlimit überschritten |
errors.RATE_LIMITED | Zu viele Anfragen |
errors.UNKNOWN | Nicht spezifizierter Fehler |
Aufrufstack
Abschnitt betitelt „Aufrufstack“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) endendWiederholbare Fehler
Abschnitt betitelt „Wiederholbare Fehler“| Typischerweise wiederholbar | Nicht wiederholbar |
|---|---|
TIMEOUT | INVALID |
UNAVAILABLE | NOT_FOUND |
RATE_LIMITED | PERMISSION_DENIED |
ALREADY_EXISTS |
if err:retryable() then -- sicher zu wiederholenendFehlerdetails
Abschnitt betitelt „Fehlerdetails“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