4.6 C 中的错误处理

在内部实现中,Lua 使用了 C 的 longjmp 机制来处理错误。(如果你使用 C++ 编译,Lua 将换成异常;细节请在源代码中搜索 LUAITHROW。)当 Lua 碰到任何错误(比如内存分配错误、类型错误、语法错误、还有运行时错误)它都会 抛出一个错误出去;也就是调用一次长跳转。在 保护环境_ 下,Lua 使用 setjmp 来设置一个恢复点;任何发生的错误都会跳转到最近的一个恢复点。

如果错误发生在保护环境之外,Lua 会先调用 panic 函数 (参见 lua_atpanic)然后调用 abort 来退出宿主程序。你的 panic 函数只要不返回(例如:长跳转到你在 Lua 外你自己设置的恢复点)就可以不退出程序。

panic 函数以错误消息处理器(参见 §2.3)的方式运行;错误消息在栈顶。不同的是,它不保证栈空间。做任何压栈操作前,panic 函数都必须先检查是否有足够的空间(参见 §4.2)。

大多数 API 函数都有可能抛出错误,例如在内存分配错误时就会抛出。每个函数的文档都会注明它是否可能抛出错误。

在 C 函数内部,你可以通过调用 lua_error来抛出错误。