0Pricing
Lua Academy · Lektion

Geschützte Aufrufe mit pcall

Fangen Sie Fehler sicher mit pcall ab und interpretieren Sie die Rückgabewerte

Geschützte Aufrufe mit pcall ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 2 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.

Grundlagen von pcall

pcall(f, ...) ruft die Funktion f mit den Argumenten ... im geschützten Modus auf. Wenn f erfolgreich ist, gibt pcall true gefolgt von allen Rückgabewerten zurück. Wenn f einen Fehler auslöst, gibt pcall false gefolgt von der Fehlermeldung zurück. Das Programm wird in beiden Fällen fortgesetzt.

local function risky(x)
  if x < 0 then error("negative input: " .. x) end
  return math.sqrt(x)
end

local ok, result = pcall(risky, 9)
print(ok, result)    -- true  3.0

ok, result = pcall(risky, -1)
print(ok, result)    -- false  ...: negative input: -1

Bestimmte Fehler abfangen

Prüfen Sie nach pcall den Typ des Fehlerwerts, um verschiedene Fehlerarten unterschiedlich zu behandeln. Tabellenfehler enthalten strukturierte Daten, String-Fehler eine Nachricht. Behandeln Sie immer beide Fälle.

local function op(errType)
  if errType == "table" then
    error({code=42, msg="structured error"})
  else
    error("plain string error")
  end
end

local ok, err = pcall(op, "table")
if not ok then
  if type(err) == "table" then
    print("Code:", err.code, "Msg:", err.msg)
  else
    print("String error:", err)
  end
end

Mehrere Rückgabewerte bei Erfolg

Bei Erfolg gibt pcall nach dem anfänglichen true alle Rückgabewerte der geschützten Funktion zurück. Speichern Sie sie in mehreren Variablen.

local function compute(a, b)
  return a + b, a * b, a - b
end

local ok, sum, product, diff = pcall(compute, 6, 4)
if ok then
  print("sum:", sum, "product:", product, "diff:", diff)
  -- sum: 10  product: 24  diff: 2
end

pcall verschachteln

pcall-Aufrufe können verschachtelt werden. Jeder pcall-Aufruf erzeugt einen unabhängigen geschützten Bereich. Ein Fehler in einem inneren pcall wird vom inneren pcall abgefangen, nicht vom äußeren. So können Sie Fallback-Strategien implementieren.

local function tryPrimary()
  error("primary failed")
end

local function tryFallback()
  return "fallback result"
end

local ok, result = pcall(tryPrimary)
if not ok then
  print("Primary failed:", result)
  ok, result = pcall(tryFallback)
end

if ok then print("Got:", result) end  -- fallback result

pcall mit Methoden

Um eine Methode (mit Doppelpunkt-Syntax) über pcall aufzurufen, übergeben Sie die Funktion und das Objekt als erstes Argument. pcall(obj.method, obj, args...) oder verpacken Sie den Aufruf in eine Closure.

local obj = {
  x = 10,
  compute = function(self, n)
    if n == 0 then error("zero divisor") end
    return self.x / n
  end
}

-- Pass method + self explicitly
local ok, v = pcall(obj.compute, obj, 2)
print(ok, v)   -- true  5.0

-- Or use a closure
ok, v = pcall(function() return obj:compute(0) end)
print(ok, v)   -- false  ...zero divisor

IO-Sicherheit mit pcall

Verpacken Sie IO-Operationen in pcall, um unerwartete Betriebssystemfehler abzufangen. Geben Sie ein konsistentes Ergebnis-/Fehlerpaar zurück, damit Aufrufer Fehlschläge angemessen behandeln können.

local function safeRead(path)
  local ok, result = pcall(function()
    local f = assert(io.open(path, "r"))
    local content = f:read("a")
    f:close()
    return content
  end)
  if ok then return result
  else return nil, result
  end
end

local data, err = safeRead("config.txt")
if data then print("Read", #data, "bytes")
else print("Error:", err)
end

Wiederholungsmuster mit pcall

Wiederholen Sie eine unzuverlässige Operation (Netzwerkanfrage, Dateischreibvorgang) mithilfe von pcall bis zu N-mal, um Fehler abzufangen. Warten Sie im produktiven Code zwischen den Versuchen (oder verwenden Sie Coroutinen).

local function retry(fn, maxAttempts)
  local attempts = 0
  while attempts < maxAttempts do
    attempts = attempts + 1
    local ok, result = pcall(fn)
    if ok then
      print("Succeeded on attempt", attempts)
      return result
    end
    print("Attempt", attempts, "failed:", result)
  end
  error("all " .. maxAttempts .. " attempts failed")
end

local n = 0
retry(function()
  n = n + 1
  if n < 3 then error("not ready") end
  return "done"
end, 5)

pcall-Ergebnisse in einer Tabelle speichern

Wenn pcall in einer Schleife verwendet wird, speichern Sie die Ergebnisse zur späteren Analyse in einer Tabelle. Das ist bei Stapelverarbeitungen nützlich, bei denen Sie alle Elemente verarbeiten und Fehler sammeln möchten, statt beim ersten Fehlschlag abzubrechen.

local jobs = {10, -5, 25, 0, 16}
local results = {}

for _, n in ipairs(jobs) do
  local ok, v = pcall(function()
    if n < 0 then error("negative") end
    return math.sqrt(n)
  end)
  results[#results+1] = {input=n, ok=ok, value=v}
end

for _, r in ipairs(results) do
  if r.ok then
    print(r.input, "->", string.format("%.3f", r.value))
  else
    print(r.input, "-> ERROR:", r.value)
  end
end

pcall im Vergleich zu xpcall

pcall fängt den Fehler ab, liefert Ihnen aber nur den Fehlerwert. Mit xpcall können Sie eine Nachrichten-Handlerfunktion angeben, die ausgeführt wird, solange der Aufrufstapel noch intakt ist, und dadurch Aufrufstapel erzeugen. Wählen Sie xpcall, wenn Sie Aufrufstapel benötigen.

-- pcall: simple, no traceback
local ok1, err1 = pcall(function()
  error("simple error")
end)
print(err1)   -- only the error message

-- xpcall: with traceback handler
local ok2, err2 = xpcall(
  function() error("traced error") end,
  function(e) return debug.traceback(e, 2) end
)
print(err2)   -- full stack trace

Rückgabekonvention von pcall

Verwenden Sie pcall als Grundlage für eine konsistente API: Geben Sie bei Erfolg immer value oder bei einem Fehlschlag nil, errorMessage zurück. Strukturieren Sie Ihre Funktionen auf diese Weise, damit Aufrufer immer wissen, was sie erwartet.

local function loadJSON(path)
  local ok, result = pcall(function()
    local f = assert(io.open(path, "r"))
    local text = f:read("a")
    f:close()
    -- Fake JSON parse for demo
    return {data = text, path = path}
  end)
  if ok then return result
  else return nil, result
  end
end

local data, err = loadJSON("data.json")
if data then print("Loaded:", data.path)
else print("Failed:", err)
end

Schnelltest

Was gibt pcall zurück, wenn die geschützte Funktion erfolgreich ist?

Zusammenfassung: pcall

Zusammenfassung:

  • pcall(f, ...) → true, results... oder false, err
  • Prüfen Sie den ersten Rückgabewert, um Erfolg oder Fehlschlag zu bestimmen
  • Bei Erfolg folgen auf true mehrere Rückgabewerte
  • Verschachteltes pcall: Jeder Aufruf fängt seine eigenen Fehler unabhängig ab
  • Wiederholungsmuster: Schleife mit pcall für unzuverlässige Operationen
  • Verwenden Sie xpcall, wenn Sie Aufrufstapel benötigen

Häufig gestellte Fragen

Ist die Lektion „Geschützte Aufrufe mit pcall“ kostenlos?

Ja — der vollständige Text von „Geschützte Aufrufe mit pcall“ 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 „Geschützte Aufrufe mit pcall“?

Fangen Sie Fehler sicher mit pcall ab und interpretieren Sie die Rückgabewerte 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 2 von 4.

Wie lange dauert die Lektion „Geschützte Aufrufe mit pcall“?

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