Lua中的错误处理与调试类

僤鯓⒐⒋嵵緔 提交于 2020-02-24 05:29:41

一、错误处理

任何程序语言都需要有错误处理,以帮助我们更好的调试程序,程序中的错误类型主要有两种:语法错误和运行错误;语法错误会导致程序无法运行,但是它很简单,能够快速定位修复,而运行错误是程序可以运行,在运行时出错;

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();否则就返回调用堆栈的回溯信息;

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!