Geschützte Aufrufe mit pcall()
Teil des Abschnitts Logik & Programmablauf der Lua-Journey von Coddy. Lektion 33 von 54.
Während error() dein Programm anhält, wenn etwas schiefgeht, möchtest du manchmal Fehler behandeln, ohne dass es abstürzt. Mit Luas Funktion pcall() kannst du Code, der möglicherweise fehlschlägt, sicher ausführen.
Der Name pcall() steht für „protected call“. Er verpackt einen Funktionsaufruf in eine Schutzschicht, die alle Fehler abfängt. Anstatt dass dein Programm abstürzt, gibt pcall() Informationen darüber zurück, was passiert ist.
Hier ist die grundlegende Syntax:
local status, result = pcall(functionName, arg1, arg2)Die Funktion pcall() gibt zwei Werte zurück. Der erste ist ein boolescher Status: true, wenn die Funktion erfolgreich war, oder false, wenn ein Fehler aufgetreten ist. Der zweite Wert hängt vom Status ab: Bei Erfolg ist es der Rückgabewert der Funktion; bei einem Fehler ist es die Fehlermeldung.
Hier ist ein praktisches Beispiel:
function divide(a, b)
if b == 0 then
error("Cannot divide by zero")
end
return a / b
end
local success, result = pcall(divide, 10, 0)
if success then
print("Result: " .. result)
else
print("Error caught: " .. result)
endIn diesem Beispiel löst die Division durch null einen Fehler aus, aber anstatt abzustürzen, fängt pcall() ihn ab. Das Programm läuft weiter und kann den Fehler ordnungsgemäß behandeln, indem es den Statuswert überprüft.
Aufgabe
EinfachSchreibe eine Funktion safeCalculate, die operation, a und b entgegennimmt und das Ergebnis der Berechnung oder eine Fehlermeldung zurückgibt.
Die Funktion sollte pcall() verwenden, um die angeforderte mathematische Operation sicher auszuführen. Erstelle eine innere Funktion, die die Berechnung basierend auf der Operationszeichenfolge durchführt, und umschließe sie dann mit pcall(), um etwaige Fehler abzufangen.
Logik:
- Erstelle eine innere Funktion, die den Operationstyp überprüft und die Berechnung durchführt
- Gib für "add"
a + bzurück - Gib für "subtract"
a - bzurück - Gib für "multiply"
a * bzurück - Prüfe für "divide", ob
b0 ist, und rufeerror("Division by zero", 0)auf, wenn dies der Fall ist; gib andernfallsa / bzurück - Rufe für jede andere Operation
error("Invalid operation", 0)auf - Verwende
pcall(), um die innere Funktion auszuführen - Gib bei Erfolg
"Result: "gefolgt vom Ergebnis zurück - Gib bei einem Fehler
"Error: "gefolgt von der Fehlermeldung zurück
Übergebe 0 als zweites Argument von error(). Dieses Argument ist die Fehlerstufe, und 0 weist Lua an, den Dateinamen und die Zeilennummer nicht vor deine Nachricht zu setzen, sodass die zurückgegebene Zeichenfolge genau "Error: Division by zero" lautet.
Parameter:
operation(Zeichenfolge): Die auszuführende Operation ("add", "subtract", "multiply" oder "divide")a(Zahl): Der erste Operandb(Zahl): Der zweite Operand
Rückgabewert: Eine Zeichenfolge, die entweder "Result: " gefolgt vom Berechnungsergebnis oder "Error: " gefolgt von der Fehlermeldung (Zeichenfolge) enthält
Probier es selbst
function safeCalculate(operation, a, b)
-- Schreibe Code hier
-- Note: rufe error(message, 0) auf, damit Lua den Dateinamen und die
-- Zeilennummer nicht vor deine Nachricht setzt.
endDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Programmablauf
1Fortgeschrittene Tabelleniteration
Iterieren mit pairs()Iterieren mit ipairs()pairs() vs. ipairs()Zusammenfassung – Charakterbogen2Weitere Funktionen der Tabellenbibliothek
table.concat()Tabellenkonstruktion & unpack()table.sort()Eigene Sortierung mit FunktionenRückblick – Highscore-Tabelle3Fortgeschrittene Funktionskonzepte
Mehrere Werte zurückgebenVariadische Funktionen (...)Funktionen als Werte erster KlasseAnonyme FunktionenWas ist eine Closure?Rückblick – Einfacher Event-Handler6Fehlerbehandlung
Die error()-FunktionGeschützte Aufrufe mit pcall()Zusammenfassung – Sichere DivisionÜbe selbstständig: Online-Lua-Compiler