Menu
CoddyTech

使用 pcall() 进行受保护的调用

本课属于 Coddy Lua 学习旅程的“逻辑与流程”单元。第 33 课,共 54 课。

虽然 error() 会在出错时停止程序,但有时你想处理错误,而不让程序崩溃。Lua 的 pcall() 函数可以让你安全地执行可能失败的代码。

名称 pcall() 是“受保护调用”的缩写。它会在函数调用外包裹一层保护机制,用来捕获所有错误。这样一来,程序不会崩溃,pcall() 会返回有关发生情况的信息。

这是基本语法:

local status, result = pcall(functionName, arg1, arg2)

pcall() 函数会返回两个值。第一个是布尔状态:如果函数执行成功,则为 true;如果发生错误,则为 false。第二个值取决于状态:如果成功,它是函数的返回值;如果发生错误,它是错误消息。

下面是一个实际示例:

function divide(a, b)
    if b == 0 then
        error("Cannot divide by zero")
    end
    return a / b
end
local success, result = pcall(divide, 10, 0)
if success then
    print("Result: " .. result)
else
    print("Error caught: " .. result)
end

在这个示例中,除以零会触发错误,但程序不会崩溃,因为 pcall() 捕获了错误。程序会继续运行,并可以通过检查状态值妥善处理错误。

challenge icon

挑战

简单

编写一个函数 safeCalculate,它接收 operation、a 和 b,并返回计算结果或错误消息。

该函数应使用 pcall() 安全地执行请求的数学运算。创建一个内部函数,根据操作字符串执行计算,然后用 pcall() 包装它,以捕获任何错误。

逻辑:

  • 创建一个内部函数,用于检查操作类型并执行计算
  • 对于 "add",返回 a + b
  • 对于 "subtract",返回 a - b
  • 对于 "multiply",返回 a * b
  • 对于 "divide",检查 b 是否为 0,如果是,则调用 error("Division by zero", 0),否则返回 a / b
  • 对于任何其他操作,调用 error("Invalid operation", 0)
  • 使用 pcall() 执行内部函数
  • 如果成功,返回 "Result: ",后面跟着计算结果
  • 如果发生错误,返回 "Error: ",后面跟着错误消息

将 0 作为 error() 的第二个参数。该参数是错误级别,0 表示 Lua 不要在消息前面添加文件名和行号,因此返回的字符串恰好是 "Error: Division by zero"。

参数:

  • operation(字符串):要执行的操作("add"、"subtract"、"multiply" 或 "divide")
  • a(数字):第一个操作数
  • b(数字):第二个操作数

返回值:一个字符串,内容为 "Result: " 后面跟着计算结果,或者 "Error: " 后面跟着错误消息(字符串)

亲手试试

function safeCalculate(operation, a, b)
    -- 在这里编写代码
    -- 注意:调用 error(message, 0),这样 Lua 就不会在你的消息前添加文件名和
    -- 行号。
end
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Lua 在线编译器