0Pricing
Lua Academy · Lektion

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 zero

Fehlerstufen

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() call

Fehler 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)
end

assert() 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 string

error() 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
end

Fehler 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) end

Fehlerweitergabe

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 failed

Aufrufstapel 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
end

Fehler 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

  1. Die Funktion error()
  2. Geschützte Aufrufe mit pcall
  3. xpcall und Nachrichten-Handler
  4. Strukturierte Fehlerobjekte
← Zurück zu Lua Academy