使用 pcall
pcall
代表受保護的呼叫。它用於向函式新增錯誤處理。pcall
與其他語言的 try-catch
類似。pcall
的優點是,如果在使用 pcall
呼叫的函式中發生錯誤,則不會中斷指令碼的整個執行。如果在使用 pcall
呼叫的函式內發生錯誤,則丟擲錯誤,其餘程式碼繼續執行。
句法:
pcall( f , arg1,···)
返回值:
返回兩個值
- status(布林值)
- 如果函式執行時沒有錯誤,則返回 true 。
- 如果函式內發生**錯誤,**則返回 false 。
- 如果功能塊內發生錯誤,則返回函式或錯誤訊息的值。
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"