一、错误处理
任何程序语言都需要有错误处理,以帮助我们更好的调试程序,程序中的错误类型主要有两种:语法错误和运行错误;语法错误会导致程序无法运行,但是它很简单,能够快速定位修复,而运行错误是程序可以运行,在运行时出错;
1.assert
断言,终止正在执行的函数,这是几乎每个语言都会提供的一个函数;在lua中,assert函数有两个参数,第一个参数,检查是否为true,如果是则不做任何事情,否则就会将第二个参数作为错误信息抛出;
local t={1,2,3}
local func = function(s)
assert(type(s) == "string", "not string")
print(s)
end
func(t)
2.error
error函数终止正在执行的函数;error(msg, level),第一个参数为错误信息,第二个参数level为系统附加的一些错误信息,帮助定位错误;
level默认为1,为调用error的位置(文件+行号);为0时不包含任何其它信息,为1时会指出调用error函数的函数;
local t={1,2,3}
local func = function(s)
if type(s) ~= "string" then
error("not string", 1)
else
print(s)
end
end
func(t)
3.pcall(protected call)
第一个参数为一个函数,返回两个参数值,第一个标记为true/false,第二个为错误信息;
pcall是以一种保护模式来调用一个函数,因此pcall可以捕获函数运行时的任何错误;
local func = function(num)
print(num * num)
end
local flag, msg= pcall(func, "hello")
if not flag then
print(msg)
end
4.xpcall
在上面pcall中,我们可以看到错误信息比较少,因此pcall返回时,lua已经销毁了调用堆栈中的部分内容;
所以lua提供了xpcall函数,它可以接受第二个参数作为一个错误处理函数,当错误发生的时候,lua会在调用堆栈展开前调用错误处理函数,于是就可以在这个函数中来获取更多的错误信息,在这里也可以使用Lua提供的debug库;
二、Debug库
1.debug()
进入一个用户交互的模式,可以通过运行字符串等查询信息;
输入cont即退出交互模式,可以继续向下运行;
2.getinfo(f)
返回一个函数信息表,其中0表示当前函数即getinfo自身,1表示调用getinfo的函数,依次类推;
3.getlocal(f,local),setlocal(f,local,value)
返回局部变量的变量名和值,传入参数f同getinfo,local为索引值,用于访问显式定义的局部变量,包括形参和临时变量等;
4.getupvalue(f,up),setupvalue(f,up,value)
返回函数f第up个上值的变量名和值;
5.traceback(message,level)
如果message为字符串,则直接返回message信息,同时level标记附加到message上的信息,同error();否则就返回调用堆栈的回溯信息;
来源:CSDN
作者:莫之
链接:https://blog.csdn.net/qq_36383623/article/details/104453433