24.3.1 应用程序中的错误处理 |
典型的情况是应用的代码运行在非保护模式下。由于应用的代码不是被Lua调用的,Lua根据上下文情况来捕捉错误的发生(也就是说,Lua不能调用setjmp)。在这些情况下,当Lua遇到像 "not enough memory" 的错误,他不知道如何处理。他只能调用一个panic函数退出应用。(你可以使用lua_atpanic函数设置你自己的panic函数)
不是所有的API函数都会抛出异常,lua_open、lua_close、lua_pcall和lua_load都是安全的,另外,大多数其他函数只能在内存分配失败的情况下抛出异常:比如,luaL_loadfile如果没有足够内存来拷贝指定的文件将会失败。有些程序当碰到内存不足时,他们可能需要忽略异常不做任何处理。对这些程序而言,如果Lua导致内存不足,panic是没有问题的。
如果你不想你的应用退出,即使在内存分配失败的情况下,你必须在保护模式下运行你的代码。大部分或者所有你的Lua代码通过调用lua_pcall来运行,所以,它运行在保护模式下。即使在内存分配失败的情况下,lua_pcall也返回一个错误代码,使得lua解释器处于和谐的(consistent)状态。如果你也想保护所有你的与Lua交互的C代码,你可以使用lua_cpcall。(请看参考手册,有对这个函数更深的描述,在Lua的发布版的lua.c文件中有它应用的例子)