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: -1Bestimmte 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
endMehrere 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
endpcall 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 resultpcall 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 divisorIO-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)
endWiederholungsmuster 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
endpcall 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 traceRü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)
endSchnelltest
Was gibt pcall zurück, wenn die geschützte Funktion erfolgreich ist?
Zusammenfassung: pcall
Zusammenfassung:
pcall(f, ...)→true, results...oderfalse, 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
- Die Funktion error()
- Geschützte Aufrufe mit pcall
- xpcall und Nachrichten-Handler
- Strukturierte Fehlerobjekte