Lua
Fehlerbehandlung
Suche…
Pcall verwenden
pcall
steht für "protected call". Es wird verwendet, um Funktionen zur Fehlerbehandlung hinzuzufügen. pcall
funktioniert ähnlich wie try-catch
in anderen Sprachen. Der Vorteil von pcall
ist, dass die gesamte Ausführung des Skripts nicht unterbrochen wird, wenn Fehler in Funktionen auftreten, die mit pcall
. Wenn ein Fehler in einer mit pcall
aufgerufenen pcall
auftritt, wird ein Fehler pcall
und der Rest des Codes wird mit der Ausführung fortgesetzt.
Syntax:
pcall( f , arg1,···)
Rückgabewerte:
Gibt zwei Werte zurück
- Status (Boolean)
- Gibt true zurück, wenn die Funktion fehlerfrei ausgeführt wurde.
- Gibt false zurück, wenn ein Fehler in der Funktion aufgetreten ist.
- Rückgabewert der Funktion oder Fehlermeldung, wenn im Funktionsbaustein ein Fehler aufgetreten ist.
pcall kann für verschiedene Fälle verwendet werden, es ist jedoch üblich, Fehler von der Funktion abzufangen, die Ihrer Funktion zugewiesen wurde. Nehmen wir zum Beispiel an, wir haben diese Funktion:
local function executeFunction(funcArg, times) then
for i = 1, times do
local ran, errorMsg = pcall( funcArg )
if not ran then
error("Function errored on run " .. tostring(i) .. "\n" .. errorMsg)
end
end
end
Wenn die angegebene Funktion in Lauf 3 fehlerhaft ist, wird dem Benutzer die Fehlermeldung angezeigt, dass diese nicht von Ihrer Funktion stammt, sondern von der Funktion, die unserer Funktion übergeben wurde. Vor diesem Hintergrund kann auch eine ausgefallene BSoD gemacht werden, die den Benutzer benachrichtigt. Dies liegt jedoch an der Anwendung, die diese Funktion implementiert, da eine API dies höchstwahrscheinlich nicht tut.
Beispiel A - Ausführung ohne PCall
function square(a)
return a * "a" --This will stop the execution of the code and throws an error, because of the attempt to perform arithmetic on a string value
end
square(10);
print ("Hello World") -- This is not being executed because the script was interrupted due to the error
Beispiel B - Ausführung mit pcall
function square(a)
return a * "a"
end
local status, retval = pcall(square,10);
print ("Status: ", status) -- will print "false" because an error was thrown.
print ("Return Value: ", retval) -- will print "input:2: attempt to perform arithmetic on a string value"
print ("Hello World") -- Prints "Hello World"
Beispiel - Ausführung von fehlerfreiem Code
function square(a)
return a * a
end
local status, retval = pcall(square,10);
print ("Status: ", status) -- will print "true" because no errors were thrown
print ("Return Value: ", retval) -- will print "100"
print ("Hello World") -- Prints "Hello World"
Fehler in Lua behandeln
Angenommen, wir haben die folgende Funktion:
function foo(tab)
return tab.a
end -- Script execution errors out w/ a stacktrace when tab is not a table
Lass es uns ein bisschen verbessern
function foo(tab)
if type(tab) ~= "table" then
error("Argument 1 is not a table!", 2)
end
return tab.a
end -- This gives us more information, but script will still error out
Wenn wir nicht möchten, dass eine Funktion ein Programm auch im Fehlerfall abstürzt, ist es in lua üblich, Folgendes zu tun:
function foo(tab)
if type(tab) ~= "table" then return nil, "Argument 1 is not a table!" end
return tab.a
end -- This never crashes the program, but simply returns nil and an error message
Nun haben wir eine Funktion, die sich so verhält, wir können Dinge wie folgt machen:
if foo(20) then print(foo(20)) end -- prints nothing
result, error = foo(20)
if result then print(result) else log(error) end
Und wenn wir wollen, dass das Programm abstürzt, falls etwas schief geht, können wir dies trotzdem tun:
result, error = foo(20)
if not result then error(error) end
Zum Glück müssen wir das nicht jedes Mal schreiben. lua hat eine funktion, die genau dies tut
result = assert(foo(20))