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

Lua错误处理

  • error
  • assert
  • pcall
  • xpcall

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)

你可能感兴趣的:(#,Lua,Lua使用笔记)