Die Funktion error()
Lösen Sie mit error() Fehler aus und verstehen Sie Fehlerstufen und -meldungen
Die Funktion error() ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Fehler auslösen
error(message, level) löst einen Lua-Fehler aus. Die Ausführung wird angehalten, und der Fehler wird im Aufrufstapel nach oben weitergegeben, bis er von pcall oder xpcall abgefangen wird oder das Programm beendet wird. Die Meldung kann einen beliebigen Wert enthalten – eine Zeichenfolge, Tabelle oder Zahl.
local function divide(a, b)
if b == 0 then
error("division by zero")
end
return a / b
end
print(divide(10, 2)) -- 5.0
-- divide(10, 0) -- ERROR: division by zeroFehlerstufen
Das zweite Argument von error() legt fest, wo der Fehler gemeldet wird. Stufe 1 (Standard) verweist auf den Aufruf von error(). Stufe 2 verweist auf den Aufrufer. Stufe 0 fügt keine Positionsinformationen hinzu. Verwenden Sie in Bibliotheksfunktionen Stufe 2, damit der Fehler dem Code des Benutzers zugeordnet wird.
local function assertPositive(n, name)
if n <= 0 then
error((name or "value") .. " must be positive, got " .. n, 2)
-- level 2: blame the caller, not this function
end
return n
end
local function compute(x)
assertPositive(x, "x") -- error points here if x <= 0
return math.sqrt(x)
end
compute(-5) -- error: "x must be positive, got -5" at compute() callFehler mit Tabellenobjekten
Wenn Sie eine Tabelle als Fehlerwert übergeben, können Aufrufer strukturierte Fehlerinformationen untersuchen: Fehlercode, Meldung und Kontext. Das ist informativer als eine einfache Zeichenfolge und ermöglicht eine programmgesteuerte Fehlerbehandlung.
local function openDB(host, port)
if port < 1 or port > 65535 then
error({code="INVALID_PORT", port=port,
msg="port out of range: " .. port})
end
-- ... connect
return {host=host, port=port}
end
local ok, err = pcall(openDB, "localhost", -1)
if not ok and type(err) == "table" then
print("Code:", err.code) -- INVALID_PORT
print("Port:", err.port) -- -1
print("Msg:", err.msg)
endassert() als syntaktische Vereinfachung
assert(v, msg) entspricht if not v then error(msg, 2) end; return v, .... Die Funktion wird idiomatisch zur Prüfung von Vorbedingungen verwendet. Ist v wahrheitswertig, gibt assert alle seine Argumente zurück, was für Verkettungen nützlich ist.
local function sqrt(n)
assert(type(n) == "number", "expected number, got " .. type(n))
assert(n >= 0, "sqrt of negative: " .. n)
return math.sqrt(n)
end
print(sqrt(16)) -- 4.0
print(sqrt(2)) -- 1.4142...
-- sqrt("hi") -- ERROR: expected number, got stringerror() im Vergleich zu return nil,err
Es gibt zwei Konventionen, um einen Fehler zu signalisieren: error() (Ausnahmestil) oder return nil, msg (funktionaler Stil). Verwenden Sie error() für wirklich unerwartete Bedingungen (Programmierfehler, Vertragsverletzungen). Verwenden Sie nil, msg für erwartete Fehler (Datei nicht gefunden, Netzwerk-Timeout).
-- Exception style (programming error)
local function mustExist(t, key)
local v = t[key]
if v == nil then error("required key missing: " .. key, 2) end
return v
end
-- Functional style (expected failure)
local function findUser(id)
-- ... database query
return nil, "user not found" -- expected: user may not exist
endFehler in Metamethoden
Fehler können innerhalb von Metamethoden ausgelöst werden. Wenn eine Metamethode einen Fehler auslöst, wird dieser an den Code weitergegeben, der die Operation ausgelöst hat (z. B. einen arithmetischen Ausdruck). Sichern Sie Metamethoden immer gegen ungültige Eingaben ab.
local SafeDiv = {}
SafeDiv.__index = SafeDiv
SafeDiv.__div = function(a, b)
if b.value == 0 then
error("SafeDiv: division by zero", 2)
end
return SafeDiv.new(a.value / b.value)
end
function SafeDiv.new(v)
return setmetatable({value=v}, SafeDiv)
end
local a = SafeDiv.new(10)
local b = SafeDiv.new(0)
local ok, err = pcall(function() return a / b end)
print(ok, err)Benutzerdefinierte Fehlertypen
Erstellen Sie eine Hilfsfunktion zum Erzeugen typisierter Fehlerobjekte. Fügen Sie ein Typkennzeichen hinzu, damit Aufrufer zwischen verschiedenen Fehlerarten unterscheiden und jede angemessen behandeln können.
local function newError(kind, msg, extra)
return setmetatable(
{kind=kind, message=msg, extra=extra},
{__tostring = function(e)
return "[" .. e.kind .. "] " .. e.message
end}
)
end
local E = {
notFound = function(name) return newError("NOT_FOUND","not found: "..name) end,
badInput = function(msg) return newError("BAD_INPUT", msg) end,
}
local ok, err = pcall(error, E.notFound("config.json"))
if not ok then print(err.kind, err.message) endFehlerweitergabe
Wenn eine Funktion eine andere Funktion aufruft, in der ein Fehler auftritt, wird dieser automatisch im Aufrufstapel nach oben weitergegeben. Sie müssen den Fehler nicht erneut auslösen – fangen Sie ihn einfach nicht ab. Fangen Sie Fehler nur auf der Ebene ab, auf der Sie sie sinnvoll behandeln oder melden können.
local function step3() error("step3 failed") end
local function step2() step3() end
local function step1() step2() end
local ok, err = pcall(step1)
if not ok then
-- err includes the source location
print("Caught at top level:", err)
end
-- Error: input:1: step3 failedAufrufstapel mit debug.traceback
Ein einfaches error() liefert eine Kontextzeile. Für einen vollständigen Aufrufstapel verwenden Sie debug.traceback(msg) als Fehlerwert. Dies geschieht typischerweise in einem xpcall-Handler.
local function buggy()
local t = nil
return t.field -- nil indexing: error
end
local ok, err = xpcall(buggy, function(e)
return debug.traceback(e, 2) -- full stack trace
end)
if not ok then
print(err) -- full traceback
endFehler erneut auslösen
Manchmal fangen Sie einen Fehler ab, um Kontext hinzuzufügen, und lösen ihn anschließend erneut aus. Verwenden Sie beim erneuten Auslösen eines String-Fehlers error(err, 0) (Ebene 0), um einem bereits formatierten Fehlertext keinen weiteren Ortspräfix hinzuzufügen.
local function loadAndParse(path)
local ok, err = pcall(function()
local f = io.open(path, "r")
if not f then error("cannot open: " .. path) end
local content = f:read("a")
f:close()
return content
end)
if not ok then
error("loadAndParse failed: " .. err, 0) -- re-raise with context
end
end
local ok2, msg = pcall(loadAndParse, "missing.txt")
print(ok2, msg)Schnelltest
Was bedeutet Ebene 2 in error("msg", 2)?
Zusammenfassung: error()
Zusammenfassung:
error(msg, level)– Fehler auslösen; Ebene 2 weist die Ursache dem Aufrufer zu- Verwenden Sie Tabellen für strukturierte Fehler mit Typ und Kontext
assert(v, msg)– idiomatische Prüfung einer Vorbedingung- Verwenden Sie
error()für Programmfehler; geben Sie für erwartete Fehlschläge nil+err zurück - Lösen Sie Fehler mit
error(err, 0)erneut aus, um das Nachrichtenformat beizubehalten
Häufig gestellte Fragen
Ist die Lektion „Die Funktion error()“ kostenlos?
Ja — der vollständige Text von „Die Funktion error()“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Die Funktion error()“?
Lösen Sie mit error() Fehler aus und verstehen Sie Fehlerstufen und -meldungen Du übst Lua Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Lua Academy zu starten?
Keine Vorkenntnisse erforderlich. Lua Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Die Funktion error()“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Lua Academy-Lektion Code schreiben und ausführen?
Ja. Jede Lua Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Die Funktion error()
- Geschützte Aufrufe mit pcall
- xpcall und Nachrichten-Handler
- Strukturierte Fehlerobjekte