Lua所遇到的任何未预期条件都会引发一个错误。因此在发生错误时不能简单的崩溃或着退出,而是结束当前程序块并返回应用程序。当错误引发时进行恰当的处理是最合适的,然而这个阶段伴随着错误的捕获、错误的处理、错误追溯等处理。Lua中有函数pcall、error、assert函数来操作错误。其中pcall用于捕获错误、error抛出一个错误、assert是error的包装
抛出错误
在Lua中抛出错误信息的函数是error,通常包含调用堆栈信息以及错误提示信息。而assert是error的包装,它有两个参数可选,第一个参数 如果返回false,那么就引发错误,抛出错误提示信息第二个参数。因此使用assert要比error更为简便。
两种方式都是可以的,而且可以自定义错误信息,简便快捷的跟踪错误位置及错误模块。
function add(a,b)return a+b
endadd(10)
lua.exe: …sers/Administrator/IdeaProjects/untitled1/Error2.lua:2: attempt to perform arithmetic on local ‘b’ (a nil value)
stack traceback:
…sers/Administrator/IdeaProjects/untitled1/Error2.lua:2: in function ‘add’
…sers/Administrator/IdeaProjects/untitled1/Error2.lua:5: in main chunk
[C]: ?
02.错误处理
们可以使用两个函数:assert 和 error 来处理错误。实例如下:
local function add(a,b)assert(type(a) == "number", "a 不是一个数字")assert(type(b) == "number", "b 不是一个数字")return a+b
end
add(10);
--实例中assert首先检查第一个参数,若没问题,assert不做任何事情;否则,assert以第二个参数作为错误信息抛出。
lua.exe: …sers/Administrator/IdeaProjects/untitled1/Error2.lua:3: b 不是一个数字
stack traceback:
[C]: in function ‘assert’
…sers/Administrator/IdeaProjects/untitled1/Error2.lua:3: in function ‘add’
…sers/Administrator/IdeaProjects/untitled1/Error2.lua:6: in main chunk
[C]: ?
01.error
error(message [, level])
- 功能:终止正在执行的函数并返回消息的内容作为错误信息,通常情况error会附加一些错误位置的信息到message的头部。
- 参数:
- level 指示获得错误的位置
- level=0 不添加错误位置信息
- level=1 默认为调用error位置,形式为文件+行号
- level=2 指出哪个调用error的函数的函数
02.assert
assert(v [, message])
– v 检查是否有错误,当为false或nil时抛出错误。
–message 可选 错误信息,当检查出有错误是抛出的信息,默认值为assertion failed!
断言就是用于在代码中捕捉这些假设,可将断言看做是异常处理的一种高级形式。断言表示为一些布尔表达式,程序员相信在程序中某个特定点,该表达式值为真。可以在任何时候启用和禁用断言验证。因此可在测试时启动断言,而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题是可重新启用断言。断言只有在debug模式下才有效。
03.pcall()
在Lua中处理错误,必须使用函数pcall(protected call)来包装需要执行的代码。pcall接收一个函数和要传递给后者的参数并执行。
pcall以一种“保护模式”来调用第一个参数,可同时捕获函数执行中的任何错误和异常。若被执行函数一切正常,pcall返回true以及被执行函数函数的返回值,否则返回nil和错误信息。也就是说成功仅仅有一个返回值,而失败则有两个返回值。
call接收一个函数和要传递给后者的参数,并执行,执行结果:有错误、无错误;返回值true或者或false, errorinfo。
04.通常在错误发生时,希望获得更多的调试信息,而不只是发生错误的位置。但pcall返回时已经销毁了调用栈的部分内容,Lua提供了xpcall来实现这个功能。
xpcall(func, handler)
Lua提供了xpcall函数接收的第二个参数是一个错误处理的函数,当错误发生时,Lua会在调用栈展看unwind前调用错误处理函数,于是就可以在这个函数中使用debug库来获取关于错误的额外信息。
debug库提供了两个通用的错误处理函数:
debug.debug 提供一个Lua提示符让用户来处理错误的原因
debug.traceback 根据调用栈来构建一个扩展的错误消息