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

  1. status (booleska)
  • Returnerar sant om funktionen kördes utan fel.
  • Returnerar falskt om ett fel inträffade i funktionen.
  1. 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))


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow