CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
进阶实战游戏功能996引擎

Lua+错误捕获:error和assert的传播本质

2026-09-29 14:46 作者:996 技术组 996引擎Lua教程传奇脚本进阶实战游戏功能996引擎

【语法算法】

error 的传播本质就这一行:

lua
error("配置文件不存在", 2)

error 抛出一个错误——第二个参数指定错误信息的层级——层级 2 表示把错误归因于调用者而不是 error 本身。今天拆开。

一、抛出、传播、捕获三段

error 的三段。抛出:error(msg) 抛出一个错误——如果没有外层 pcall 捕获,程序直接终止——如果有外层 pcall,错误被捕获并作为 pcall 的第二个返回值。传播:错误沿着调用栈向外传播——每一层调用栈如果都没有 pcall,错误就一层层往外传——直到主 chunk 或者被某层 pcall 拦截。捕获:外层 pcall 捕获错误后走错误处理分支——错误信息里包含了原始的文件名和行号——层级参数决定了错误信息指向哪一层的调用。三段连起来:error 玩的是"错误的显式声明和传播链"——不是所有的错误都应该被捕获——有些错误就是应该让程序停下来。

mermaid
graph TD
    A["error(msg, 2)"] --> B{"外层有pcall?"}
    B -->|是| C["pcall捕获错误"]
    C --> D["ok=false"]
    C --> E["result=错误信息"]
    B -->|否| F["程序终止"]
    F --> G["打印错误堆栈"]

二、error 和 assert 的分界

lua
local function loadConfig(path)
    local file = io.open(path, "r")
    assert(file, "配置文件不存在: " .. path)
    local content = file:read("*a")
    file:close()
    assert(content ~= "", "配置文件为空: " .. path)
    return content
end

local ok, err = pcall(loadConfig, "/nonexistent/config.json")
if not ok then
    print("加载失败:", err)
end

assert(condition, msg) 是 error 的语法糖——条件为 false 或 nil 时自动调用 error(msg)——assert 的错误信息只在条件失败时才拼接——条件为 true 时第二个参数不会被执行——这是 assert 和 if-not-then-error 的性能差异。

三、层级的意义与消息的格式

error 的层级参数是错误定位的关键:层级 1 指向 error 本身的调用位置,层级 2 指向调用 error 的函数的位置,层级 0 不添加位置信息——层级 2 是最常用的,因为错误的责任在调用者而不是 error 函数。错误消息的格式也要统一:"文件名:描述" 或 "模块名:描述"——统一的格式让日志过滤和错误分类变得简单。最后一条纪律:error 的第二个参数(层级)只在调试时有意义——线上环境应该用 xpcall 替代 pcall 加上错误处理函数——xpcall 可以在错误发生的第一时间获取堆栈信息,而不是等到错误传播到外层再回溯。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

进阶实战游戏功能

绝境回纹:血越少纹越亮,一口气回到满

【游戏功能】 再抛一个老问题:奶量是固定好还是浮动好?固定回五十的术式,满血喝是五十、残血喝也是五十,账目清楚,可总差点意思…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

蚀蓝纹咒:抽干它的法力,咒念憋在喉咙里

【游戏功能】 前阵子一场"永动机事故"在群里传了半天:某个会喷火的精英怪被玩家围了一整晚,火喷了八个钟头没停——后台一看,它…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

双纹换形:红纹饮刀蓝纹披甲,一念换身

【游戏功能】 mode=mode==='red'?'blue':'red' ——先拆这一行。一个变量存着当前纹色,三元运算符…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

免死金纹:纹碎金光,刀下留人一线

【游戏功能】 上一版埋了个查了半宿的隐蔽报错:测试组报"玩家血条归零了人还站着",后台的死亡日志一条没有,复活接口也没被调过…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

夺纹掠势:剥了它的怒,披在我身上

【游戏功能】 先抛一个坑:增益为什么只能自己挂?怒气、护体、神行,攻略里全在教你"什么时候开自己的招",可怪身上明晃晃挂着的…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

反纹镜咒:纹光一闪,它的火原路奉还

【游戏功能】 昨天夜里一场线上事故把"反纹"顶上了台面:一个玩家把反纹挂在自己身上站桩挂机,怪的火球过来他没倒,反倒躺下的是…

2026-10-01 20:32 996 技术组