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