- 一些 Lua 的操作可能会引发错误。
- 通过捕获错误可以继续流程,从而不用担心因错误导致的程序中断。
- Lua 可以调用 error 函数(永远不会返回) 显式地引发错误
- 可以使用
pcall
或xpcall
执行受保护地调用去捕获 Lua 程序中的错误。pcall
函数在保护模式中调用给定函数。- 在运行函数时,当错误发生会终止函数执行并且控制会立即返回到
pcall
并返回一个状态码
- 在运行函数时,当错误发生会终止函数执行并且控制会立即返回到
- 因为 Lua 是一个嵌入式扩展语言,Lua 的代码由主机程序里的 C 语言代码的调用并执行。
- 当你独立使用 Lua 的时候, Lua 应用即主机程序。
- 通常来说,这种调用是受保护的。
- 编译或执行 Lua 模块的时候发生不受保护的错误,控制权将交还给主机
- 主机会适当地进行操作,例如打印错误信息。
- 当错误产生的时候,错误对象与错误信息一起被 Lua 程序传递。
- Lua 本身只会产生
String
类型的错误对象,但是程序可以产生任何值代表的错误对象。 - 由 Lua 程序 或 主机来处理这些错误对象。
- 由于历史原因,错误对象通常被称为错误消息,即使这些对象并不是
String
类型的。
- Lua 本身只会产生
- 当使用
xpcall
或 C 语言中的lua_pcall
时,可以给出一个消息处理程序,以便在错误出现时调用。 - 这个函数与原始错误对象一起调用,并返回一个新的错误对象。
- 在错误展开堆之前被调用,这样可以收集更多的错误信息
- 例如可以检查栈并创建栈回溯
- 在错误展开堆之前被调用,这样可以收集更多的错误信息
- 消息处理程序受保护的调用
- 在消息处理程序中的错误会再次调用消息处理程序
- 如果这个循环持续太久,Lua 会打破这个循环并返回适当的消息。
- 只有在发生常规运行时错误才会调用消息处理程序。
- 内存分配错误,运行
finalizers
或其他消息处理程序不会调用当前消息处理程序。 - Lua 也提供了一个警告系统
warn
- 不像错误,警告不会干涉程序的运行
- 他们通常只会给用户返回信息,尽管这种操作可以在 C 语言中被修改
lua_setwarnf