error
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
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
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
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 ]]