使用 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() 捕获了错误。程序会继续运行,并可以通过检查状态值妥善处理错误。
挑战
简单编写一个函数 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这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Lua 在线编译器