使用 pcall

pcall 代表受保護的呼叫。它用於向函式新增錯誤處理。pcall 與其他語言的 try-catch 類似。pcall 的優點是,如果在使用 pcall 呼叫的函式中發生錯誤,則不會中斷指令碼的整個執行。如果在使用 pcall 呼叫的函式內發生錯誤,則丟擲錯誤,其餘程式碼繼續執行。

句法:

pcall( f , arg1,···)

返回值:

返回兩個值

  1. status(布林值)
  • 如果函式執行時沒有錯誤,則返回 true
  • 如果函式內發生**錯誤,**則返回 false
  1. 如果功能塊內發生錯誤,則返回函式錯誤訊息的值。

pcall 可用於各種情況,但常見的是從功能中捕獲錯誤。例如,假設我們有這個功能:

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

當執行 3 中給定的函式錯誤時,錯誤訊息將清楚地告知使用者它不是來自你的函式,而是來自給我們函式的函式。此外,考慮到這一點,可以使花哨的 BSoD 通知使用者。但是,這取決於實現此功能的應用程式,因為 API 很可能不會這樣做。

例 A - 沒有 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

例 B - 使用 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"

示例 - 執行完美無瑕的程式碼

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"