Lua脚本执行中途发生报错该如何处理?

1 个回答

  • 王重阳
    不要和差点意思的人周旋。
    ## 作用 Lua 脚本执行中途发生错误时,不会简单地让宿主程序崩溃,而是结束当前 chunk,并把错误返回到调用方。程序可以根据错误类型选择: - 主动抛出错误:使用 `error(msg)` 或 `assert(value, msg)`。 - 返回错误码:函数在可预期、可恢复的异常情况下返回 `nil` 和错误信息。 - 由调用方决定恢复、提示用户,或继续终止执行。 ## 原理 ### 1. 主动触发错误 当程序遇到非法输入或不应继续执行的情况时,可以调用 `error` 显式报错: ```lua print("enter a number:") n = io.read("*number") if not n then error("invalid input") end ``` 常见的“判断失败后报错”可以用 `assert` 简化: ```lua n = assert(io.read("*number"), "invalid input") ``` `assert` 的第一个参数如果不是 `false` 或 `nil`,就返回该值;否则抛出错误,第二个参数会作为错误消息。 需要注意:`assert` 是普通函数,调用前会先计算所有参数,因此复杂的错误消息拼接即使成功也会执行。必要时应使用显式判断: ```lua n = io.read() if not tonumber(n) then error("invalid input: " .. n .. " is not a number") end ``` ### 2. 抛错与返回错误码的选择 Lua 中处理异常通常有两种基本方式: - **抛出错误**:适合本可避免的程序错误,例如对非数字执行算术运算、调用非函数、索引非 table 等。 - **返回错误码**:适合难以提前避免、可能由外部环境引起且有机会恢复的情况,通常返回 `nil` 加错误消息。 例如,`math.sin` 收到 table 通常说明程序本身有问题,应直接报错;而文件可能不存在或无权限,无法总是在调用前可靠判断,因此 `io.open` 失败时返回 `nil` 和错误信息: ```lua file, msg = io.open(name, "r") if not file then print(msg) end ``` 调用方可以提示用户重新输入文件名,也可以使用 `assert` 在不准备恢复时把失败转换为错误: ```lua file = assert(io.open(name, "r")) ``` 核心原则是:**容易避免、表示程序缺陷的异常应报错;外部因素导致、可预期且可能恢复的异常应返回错误码。**
    发布于 2026-10-27 01:56 •IP属地 安徽
    举报
    评论
    收藏