课时 15 · 错误处理与调试

课时 15 · 错误处理与调试(Lua 进阶):能定位并妥善处理运行时错误。含可运行的示例代码、练习与验收要点,示例锁定 Lua 5.1,可在站内在线运行验证。

教程/第二部分 · Lua 进阶更新于 2026-10-073 个小节 教程第 18 / 23 篇 Lua进阶

本课的代码可以就地复制;点代码块右上角的「运行这段」, 会带着这段代码打开 Lua 在线运行器 并直接跑出结果 (课程示例统一按 5.1 跑;运行器里也能切到 5.3)。

本课的代码跑在 996 引擎里,用到的是服务端接口(changeexp、 SetInt 这类),在线运行器里没有这些函数。 每个函数的签名都能在 文档检索 里按名字查到原文。

本课目标

  • 能定位并妥善处理运行时错误。

知识讲解

pcall 保护调用:返回成功标志与返回值或错误信息;xpcall 可挂错误处理函数;error 主动抛错;assert 断言条件。引擎脚本中常用 pcall 包裹可能失败的逻辑(如物品发放),失败时打印日志而不让整个脚本崩溃。调试手段:print 输出关键变量、分阶段注释排查、检查错误信息中的文件与行号。

示例:pcall 保护

function risky(x)
    if type(x) ~= 'number' then error('参数必须为数字') end
    return 100 / x
end

local ok, result = pcall(risky, 0)
if ok then
    print('成功', result)
else
    print('失败原因:', result)
end

练习任务

  • 给模块加错误保护并输出日志:模块内每个公开函数用 pcall 包裹,失败时把错误信息写入 log.txt。

参考:日志与保护

local M = {}
local function log(err)
    local f = io.open('log.txt', 'a')
    f:write(os.date('%H:%M:%S'), ' ', tostring(err), '\n')
    f:close()
end
function M.safe(fn, ...)
    local ok, res = pcall(fn, ...)
    if not ok then log(res) end
    return ok, res
end
return M
本篇依据
  • 《996 新三端 Lua 开发教学技术手册》课时 15

参数与取值以你本机版本的官方帮助文档为准,不同版本之间有过调整。