Menu
Coddy logo textTech

Geschützte Aufrufe mit pcall()

Teil des Abschnitts Logic & Flow der Lua-Journey von Coddy — Lektion 33 von 54.

Während error() Ihr Programm stoppt, wenn etwas schiefgeht, möchten Sie manchmal Fehler behandeln, ohne dass das Programm abstürzt. Die Funktion pcall() von Lua ermöglicht es Ihnen, Code sicher auszuführen, der fehlschlagen könnte.

Der Name pcall() steht für „protected call“ (geschützter Aufruf). Er hüllt einen Funktionsaufruf in eine Schutzschicht ein, die alle Fehler abfängt. Anstatt dass Ihr 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 – im Erfolgsfall ist es der Rückgabewert der Funktion; wenn ein Fehler aufgetreten ist, 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)
end

In diesem Beispiel löst die Division durch Null einen Fehler aus, aber anstatt abzustürzen, fängt pcall() diesen ab. Das Programm läuft weiter und kann den Fehler kontrolliert behandeln, indem es den Statuswert überprüft.

challenge icon

Aufgabe

Einfach

Schreiben Sie 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. Erstellen Sie eine innere Funktion, die die Berechnung basierend auf dem Operation-String durchführt, und umschließen Sie diese dann mit pcall(), um etwaige Fehler abzufangen.

Logik:

  • Erstellen Sie eine innere Funktion, die den Operationstyp prüft und die Berechnung durchführt
  • Für "add", geben Sie a + b zurück
  • Für "subtract", geben Sie a - b zurück
  • Für "multiply", geben Sie a * b zurück
  • Für "divide", prüfen Sie, ob b gleich 0 ist, und rufen Sie error("Division by zero") auf, falls dies zutrifft, andernfalls geben Sie a / b zurück
  • Für jede andere Operation rufen Sie error("Invalid operation") auf
  • Verwenden Sie pcall(), um die innere Funktion auszuführen
  • Bei Erfolg geben Sie "Result: " gefolgt von dem Ergebnis zurück
  • Wenn ein Fehler auftritt, geben Sie "Error: " gefolgt von der Fehlermeldung zurück

Parameter:

  • operation (string): Die auszuführende Operation ("add", "subtract", "multiply" oder "divide")
  • a (number): Der erste Operand
  • b (number): Der zweite Operand

Rückgabewert: Ein String, der entweder "Result: " gefolgt vom Berechnungsergebnis oder "Error: " gefolgt von der Fehlermeldung (String) enthält

Spickzettel

Die Funktion pcall() (protected call) ermöglicht es Ihnen, Code, der fehlschlagen könnte, sicher auszuführen, ohne dass Ihr Programm abstürzt.

Grundlegende Syntax:

local status, result = pcall(functionName, arg1, arg2)

pcall() gibt zwei Werte zurück:

  • status: true, wenn die Funktion erfolgreich war, false, wenn ein Fehler aufgetreten ist
  • result: Der Rückgabewert der Funktion bei Erfolg oder die Fehlermeldung, falls ein Fehler aufgetreten ist

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

Dies fängt den Fehler ab, anstatt abzustürzen, sodass das Programm fortgesetzt und der Fehler kontrolliert behandelt werden kann.

Probier es selbst

function safeCalculate(operation, a, b)
    -- Schreibe hier den Code
end
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logic & Flow