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