assert函数
如果assert函数第一个参数检测到异常,会输出第二个参数定义的错误信息,以及对应的错误信息
-- 执行
a = 1
assert(type(a) == "string", "变量a不是一个字符串")
-- 返回
lua: index.lua:2: 变量a不是一个字符串
stack traceback:
[C]: in function 'assert'
index.lua:2: in main chunk
[C]: in ?
error函数
功能:终止正在执行的函数,并返回message的内容作为错误信息
语法格式
error(message[, level])
level=1:默认,调用error的位置(文件+行号)
level=2:指出调用error的函数
level=0:不添加错误位置信息
pcall
pcall用来包装要执行的代码,如果存在异常,不会直接被抛出,而是作为返回值的返回
示例抛出异常:
function test()
error("我抛出了一个异常")
end
result, err = pcall(test)
print(result)
print(err)
-- 返回
$ lua index.lua
false
index.lua:2: 我抛出了一个异常
示例正常代码:
function test(a, b)
return a, b
end
result, var1, var2 = pcall(test, 1, 2)
print(result)
print(var1)
print(var2)
-- 返回
$ lua index.lua
true
1
2
xpcall和debug
xpcall接收两个参数,第一个参数与pcall函数的一样,第二个参数用于接收一个异常处理函数,后续参数用于给第一个函数传参。
debug.debug:提供一个Lua提示符,让用户来检查错误
debug.traceback():根据调用栈来构建一个扩展的错误消息
异常代码:
function test()
error("我是异常信息")
end
function handleError()
print("我是异常处理函数")
print("Error:" .. debug.traceback())
end
result = xpcall(test, handleError)
print(result)
-- 返回
$ lua index.lua
我是异常处理函数
Error:stack traceback:
index.lua:6: in function 'handleError'
[C]: in function 'error'
index.lua:2: in function 'test'
[C]: in function 'xpcall'
index.lua:8: in main chunk
[C]: in ?
false
正常代码:
function test(a, b)
return a, b
end
function handleError()
print("我是异常处理函数")
print("Error:" .. debug.traceback())
end
result, arr1, arr2 = xpcall(test, handleError, 1, 2)
print(result)
print(arr1)
print(arr2)
-- 返回
$ lua index.lua
true
1
2