24.3 C API的错误处理 |
不象C++或者JAVA一样,C语言没有提供一种异常处理机制。为了改善这个难处,Lua利用C的setjmp技巧构造了一个类似异常处理的机制。(如果你用C++来编译Lua,那么修改代码以使用真正的异常并不困难。)
Lua中的所有结构都是动态的:它们按需增长,最终当可能时又会缩减。意味着内存分配失败的可能性在Lua中是普遍的。几乎任意操作都会面对这种意外。Lua的API中用异常发出这些错误而不是为每步操作产生错误码。这意味着所有的API函数可能抛出一个错误(也就是调用longjmp)来代替返回。
当我们写一个库代码时(也就是被Lua调用的C函数)长跳转(long jump)的用处几乎和一个真正的异常处理一样的方便,因为Lua抓取了任务偶然的错误。当我们写应用程序代码时(也就是调用Lua的C代码),无论如何,我们必须提供一种方法来抓取这些错误。