Lua中assert( )函数的使用

当Lua遇到不期望的情况时就会抛出错误,比如:两个非数字进行相加;调用一个非函数的变量;访问表中不存在的值等。你也可以通过调用error函数显示的抛出错误,error的参数是要抛出的错误信息。

assert(a,b) --a是要检查是否有错误的一个参数,b是a错误时抛出的信息。第二个参数b是可选的。

 

当用error来抛出错误时

print("enter a number:")
n = io.read("*number")
if not n then
    error("invalid input")
end

Lua提供了专门的内置函数assert( )来完成上述的类似功能

print("enter a number:")
n = assert(io.read("*number"), "invalid input")

 

assert首先检查的是第一个参数是否返回错误,如果不返回错误,则assert简单返回,否则则以第二个参数抛出异常信息。
assert()是普通函数,他首先计算第一个参数的合理性,然后再根据结果判断正常返回还是返回第二参数的错误信息,如:

local function add(a,b)
   assert(type(a) == "number", "a 不是一个数字")
   assert(type(b) == "number", "b 不是一个数字")
   return a+b
end
add(10)

执行以上程序会出现如下错误:

lua: test.lua:3: b 不是一个数字
stack traceback:
    [C]: in function 'assert'
    test.lua:3: in local 'add'
    test.lua:6: in main chunk
    [C]: in ?

因为在执行方法add时只传入了一个数字,第二个参数默认为空值nil,nil不为数字,所以异常

 

以下还有部分示例

1.「没有Assert的情况」

--这里输入一个数字  
print(string.format("Please Enter A Number:"))  
input = io.read("*number")  
print(input)  

当输入的是“?”时,结果如下

可以看到,系统没有报错,可以正常运行。

2.「有Assert的情况」

--这里输入一个数字  
print(string.format("Please Enter A Number:"))  
input1 = assert(io.read("*number"))  
print(input)  

当再次输入“?”时,结果就会不相同了

可以看到,当有assert包围代码后,遇到错误,会抛出异常,而不会上刚刚那样。这样的用处十分之大,当项目大了之后,出错可以很好地定位到是哪里出错。

 

另外,还有 pcall 和 xpcall、debug 也可以获取异常,具体内容可以访问:菜鸟教程

posted @ 2022-05-16 17:01  青丝·旅人  阅读(3321)  评论(0编辑  收藏  举报