Fehler
Die globale Tabelle errors erstellt und untersucht strukturierte Fehler mit Kategorien, Details und Wiederholungsmetadaten. Sie ist ohne require verfügbar.
Diese Seite ist eine API-Referenz. Jeder Codeblock ist ein isoliertes Snippet und kein vollständiger Eintrag. Variablen wie err stehen für einen Fehler, den der umgebende Anwendungscode zurückgibt oder erstellt; das Wrapping-Beispiel setzt voraus, dass db ein von der Anwendung bereitgestellter Datenbank-Client ist.
Fehler erstellen
-- Simple message (kind defaults to UNKNOWN)
local err = errors.new("something went wrong")
-- With kind, retryable, and 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.
Fehler umschließen
Umschließen Sie einen Fehler, um Kontext hinzuzufügen und dabei Art, Wiederholungsmetadaten und Details beizubehalten:
local data, err = db:query("SELECT * FROM users")
if err then
return nil, errors.wrap(err, "failed to load users")
end
Fehlermethoden
| Methode | Rückgabewert | 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-Stacktrace |
tostring(err) |
string | Vollständige Darstellung |
Art prüfen
if errors.is(err, errors.INVALID) then
-- handle invalid input
end
-- Or compare directly
if err:kind() == errors.NOT_FOUND then
-- handle missing resource
end
Fehlerarten
| Konstante | Anwendungsfall |
|---|---|
errors.NOT_FOUND |
Ressource ist nicht vorhanden |
errors.ALREADY_EXISTS |
Ressource ist bereits vorhanden |
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 |
Konflikt im Ressourcenzustand |
errors.TIMEOUT |
Zeitlimit der Operation überschritten |
errors.RATE_LIMITED |
Zu viele Anfragen |
errors.UNKNOWN |
Nicht spezifizierter Fehler |
Aufrufstack
Mit errors.call_stack untersuchen Sie einen strukturierten Aufrufstack:
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
Wiederholbare Fehler
Die Wiederholbarkeit ist eine Fehlermetadatenangabe und keine Eigenschaft, die eine Fehlerart garantiert. Prüfen Sie den Rückgabewert von err:retryable(), statt ihn aus err:kind() abzuleiten. nil bedeutet, dass der Fehler keine Aussage dazu enthält, ob ein weiterer Versuch sinnvoll ist.
if err:retryable() then
-- safe to retry
end
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