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
来抛出错误。