Skip to content

2.3 - 错误处理

在Lua中有些操作会 抛出(raise) 错误。错误会打断程序的正常流程,可以通过 捕获(catching) 错误来继续。

Lua代码可以通过调用error函数来显式地抛出异常。(此函数永远不返回。)

对于在Lua中捕获异常,你可以使用pcall(或者xpcall)来发起一个 保护调用(protected call)pcall函数将在 保护模式(protected mode) 下调用给定函数。任何错误的产生都会停止执行函数,控制流直接返回到pcall调用处,并返回其状态码。

因为Lua是一个被嵌入的扩展语言,Lua代码的启动执行是由宿主程序中的C代码调用的。(当你独立使用Lua的时候,宿主程序就是那个lua应用程序。)通常此调用都是被保护的;所以当一个其他错误发生在Lua块的编译或执行中时,控制流会回到宿主处,宿主程序就可以采取合适的措施,例如打印错误消息。

每当有错误的时候,带着关于其信息的一个错误对象会被生成出来。Lua本身只生成其错误对象为字符串的错误,但是程序将任何类型作为其生成错误的错误对象。这些错误对象有Lua程序或宿主来对其做处理。因为一些历史原因,错误对象通常被称之为 错误信息(error message) , 尽管它不一定非得是个字符串。

当你使用xpcall(或者C接口lua_pcall)时,你可以给定一个 消息处理方法( message handler) 用于错误处理中。这个方法由原始的错误对象调用并返回一个新的错误对象。它于错误出现时调用栈展开前被调用,所以它可以收集更多有关于错误的信息,例如调查栈并创建一个栈的回溯信息。这个消息处理方法仍然处于保护模式下,所以消息处理方法中的错误会再次出发消息处理方法。如果这个循环持续得太长了,Lua会打断并返回一个合适的消息。这个消息处理方法只会用于合规的运行时错误,它不会因为内存分配错误而被调用,也不会因为运行结束器或其他消息处理方法而被调用。

Lua还提供了系统警告 warnings (参见warn)。与错误不同,警告不会以任何方式干扰程序执行。它通常只是生成一个消息给用户,尽管此行为可以用C改变(参见lua_setwarnf)。