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

  1. 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.
  1. 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))


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow