2.3 -- 错误处理
由于 Lua 是一门嵌入式扩展语言,其所有行为均源于宿主程序中 C 代码对某个 Lua 库函数的调用。
(单独使用 Lua 时,lua
程序就是宿主程序。)
所以,在编译或运行 Lua 代码块的过程中,无论何时发生错误,
控制权都返回给宿主,由宿主负责采取恰当的措施(比如打印错误消息)。
可以在 Lua 代码中调用 error
函数来显式地抛出一个错误。
如果你需要在 Lua 中捕获这些错误,
可以使用 pcall
或
xpcall
在 保护模式 下调用一个函数。
无论何时出现错误,都会抛出一个携带错误信息的 错误对象 (错误消息)。 Lua 本身只会为错误生成字符串类型的错误对象, 但你的程序可以为错误生成任何类型的错误对象, 这就看你的 Lua 程序或宿主程序如何处理这些错误对象。
使用 xpcall
或
lua_pcall
时,
你应该提供一个 消息处理函数 用于错误抛出时调用。
该函数需接收原始的错误消息,并返回一个新的错误消息。
它在错误发生后栈尚未展开时调用,
因此可以利用栈来收集更多的信息,
比如通过探知栈来创建一组栈回溯信息。
同时,该处理函数也处于保护模式下,所以该函数内发生的错误会再次触发它(递归)。
如果递归太深,Lua 会终止调用并返回一个合适的消息。