Lua所遇到的任何未预期条件都会引发一个错误。因此在发生错误时不能简单的崩溃或着退出,而是结束当前程序块并返回应用程序。当错误引发时进行恰当的处理是最合适的,然而这个阶段伴随着错误的捕获、错误的处理、错误追溯等处理。Lua中有函数pcall、error、assert函数来操作错误。其中pcall用于捕获错误、error抛出一个错误、assert是error的包装。
一、抛出错误
在Lua中抛出错误信息的函数是error,通常包含调用堆栈信息以及错误提示信息。而assert是error的包装,它有两个参数可选,第一个参数如果返回false,那么就引发错误,抛出错误提示信息第二个参数。因此使用assert要比error更为简便。
两种方式都是可以的,而且可以自定义错误信息,简便快捷的跟踪错误位置及错误模块。
二、捕获及处理错误
抛出错误会引发程序停止执行,那么如何在发现错误的情况下继续程序的运行呢?pcall函数为程序的异常处理提供了很好的支持,它让可能会发生错误的程序在安全的环境内执行,如果发生错误,那么程序不停止,可根据需要去调用自定义错误处理。
pcall函数在以一种“安全模式”来调用它的第一个参数,它可以捕获函数执行中的任何错误,如果没有发生错误,那么返回true及函数调用的返回值,否则返回false及错误信息。当然错误信息不一定是一个字符串,还可以是lua中的任何值。
三、错误消息与追溯
当错误发生时,如果需要能够追溯到发生错误时的函数调用情况即显示一个完整的函数调用栈,那么就要使用xpcall函数,因为pcall函数在返回其消息时,它已经销毁了调用栈的部分内容。xpcall函数除了接受一个被调用的函数以外,还有第二个参数,即错误处理函数。当错误发生时,Lua会在调用栈展开前调用错误处理函数。可以在处理函数中使用debug库来获取有关错误的额外信息,一个是debug.debug()函数,另一个是debug.traceback()函数,其中debug函数会提供一个Lua操作符( lua_debug> ),让用户来检查错误的原因。而traceback函数会根据调用栈来构建一个扩展错误消息,当然也可以在任何时候调用这个函数来获取当前的调用栈信息。