Lua错误处理之error、assert、pcall和xpcall

匿名 (未验证) 提交于 2019-12-02 23:34:01
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fightsyj/article/details/90301192

Lua错误处理

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

参考:
Lua 5.3 参考手册
Lua 学习笔记(八)错误(error)

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