Lua
Felhantering
Sök…
Använda pcall
pcall
står för "skyddat samtal". Det används för att lägga till felhantering i funktioner. pcall
fungerar på samma sätt som try-catch
på andra språk. Fördelen med pcall
är att hela exekveringen av skriptet inte avbryts om fel uppstår i funktioner som kallas med pcall
. Om ett fel i en funktion som kallas med pcall
inträffar pcall
ett fel och resten av koden fortsätter körningen.
Syntax:
pcall( f , arg1,···)
Returvärden:
Returnerar två värden
- status (booleska)
- Returnerar sant om funktionen kördes utan fel.
- Returnerar falskt om ett fel inträffade i funktionen.
- returnera värdet för funktionen eller felmeddelandet om ett fel inträffade i funktionsblocket.
pcall kan användas i olika fall, men vanligt är att fånga fel från den funktion som har givits till din funktion. Låt oss till exempel säga att vi har den här funktionen:
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
När de givna funktionsfelen på körning 3 kommer felmeddelandet att vara tydligt för användaren att det inte kommer från din funktion, utan från den funktion som gavs till vår funktion. Med detta i åtanke kan en snygg BSoD göras för att meddela användaren. Men det är upp till applikationen som implementerar denna funktion, eftersom ett API troligtvis inte kommer att göra det.
Exempel A - Utförande utan 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
Exempel B - Exekvering med 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"
Exempel - Utförande av felfri kod
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"
Hanteringsfel i Lua
Förutsatt att vi har följande funktion:
function foo(tab)
return tab.a
end -- Script execution errors out w/ a stacktrace when tab is not a table
Låt oss förbättra det lite
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
Om vi inte vill att en funktion ska krascha ett program även i händelse av ett fel är det standard i lua att göra följande:
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
Nu har vi en funktion som uppför sig så, vi kan göra sådana saker:
if foo(20) then print(foo(20)) end -- prints nothing
result, error = foo(20)
if result then print(result) else log(error) end
Och om vi vill att programmet kraschar om något går fel kan vi fortfarande göra det:
result, error = foo(20)
if not result then error(error) end
Lyckligtvis behöver vi inte ens skriva allt det varje gång; lua har en funktion som gör exakt detta
result = assert(foo(20))