error (message [, level])
中止上一次保护函数调用,将错误对象 message 返回。 函数 error 永远不会返回。
当 message 是一个字符串时,通常 error 会把一些有关出错位置的信息附加在消息的前头。 level 参数指明了怎样获得出错位置。 对于 level 1 (默认值),出错位置指 error 函数调用的位置。 Level 2 将出错位置指向调用 error的函数的函数;以此类推。 传入 level 0 可以避免在消息前添加出错位置信息。
在Lua中使用error函数抛出错误信息,通常包含调用堆栈信息以及错误提示信息!
第一个参数message为自定义的错误提示信息。
第二个参数为可选的出错位置信息,默认为1,即为调用error函数的位置;2即为调用error函数的函数的位置;0则不打印出错位置信息!
function testError()
error("error test1")
-- error("error test2", 1)
-- error("error test3", 0)
-- error("error test4", 2)
end
testError()
--[[
lua: C:\Users\user\Desktop\transition\csdn\test.lua:2: error test1
stack traceback:
[C]: in function 'error'
C:\Users\user\Desktop\transition\csdn\test.lua:2: in function 'testError'
C:\Users\user\Desktop\transition\csdn\test.lua:8: in main chunk
[C]: ?
]]
assert (v [, message])
如果其参数 v 的值为假(nil 或 false), 它就调用 error; 否则,返回所有的参数。 在错误情况时, message 指那个错误对象; 如果不提供这个参数,参数默认为 “assertion failed!” 。
assert是error的包装,将判断之类的操作包装了进去!所以使用assert比之使用error更为方便!
第一个参数为nil或判断的结果为false的时候抛出错误,中止运行,调用error函数;否则继续执行!
第二个参数为可选的错误提示信息,如果提供这个参数,调用error函数的时候则打印出message;否则使用默认的"assertion failed!"。
function testAssert()
local a, b = "hello", "world"
assert(a == b, "a,b is not equal !")
print("next operate")
end
testAssert()
--[[
lua: C:\Users\user\Desktop\transition\csdn\test.lua:3: a,b is not equal !
stack traceback:
[C]: in function 'assert'
C:\Users\user\Desktop\transition\csdn\test.lua:3: in function 'testAssert'
C:\Users\user\Desktop\transition\csdn\test.lua:7: in main chunk
[C]: ?
]]
pcall (f [, arg1, ···])
传入参数,以 保护模式 调用函数 f 。 这意味着 f 中的任何错误不会抛出; 取而代之的是,pcall 会将错误捕获到,并返回一个状态码。 第一个返回值是状态码(一个布尔量), 当没有错误时,其为真。 此时,pcall 同样会在状态码后返回所有调用的结果。 在有错误时,pcall 返回 false 加错误消息。
pcall会捕捉错误,但不会抛出,所以程序的运行不会被中止!
第一个参数为目标函数,如果目标函数执行发生错误,pcall函数返回false和错误信息;否则pcall函数返回true和目标函数所有的调用结果!
后面的参数为目标函数的参数列表,可选!
function testPcall(arg1, arg2)
print(arg1, arg2)
error("pcall test")
-- return "pcall test"
end
local ret, msg = pcall(testPcall, "hello", "fightsyj")
print(ret, msg)
print("next operate")
--[[
hello fightsyj
false C:\Users\user\Desktop\transition\csdn\test.lua:3: pcall test
next operate
]]
xpcall (f, msgh [, arg1, ···])
这个函数和 pcall 类似。 不过它可以额外设置一个消息处理器 msgh。
xpcall在pcall的基础之上还可以加一个错误处理函数!
第一个参数以及后面的参数列表和pcall一样!
第二个参数为错误处理函数,可以在这个函数中做打印堆栈信息等操作!
function testXpcall()
error("xpcall test")
-- return "pcall test"
end
-- 错误处理函数
function dealFunc()
-- print(debug.traceback())
print("xpcall dealFunc")
end
local ret, msg = xpcall(testXpcall, dealFunc)
print(ret, msg)
print("next operate")
--[[
xpcall dealFunc
false nil
next operate
]]
参考:
Lua 5.3 参考手册
Lua 学习笔记(八)错误(error)