lua中的错误处理(assert、error、pcall、xpcall、debug)

assert(conditions,message)
assert函数首先检查第一个参数,若正确则继续往下执行,否则assert以第二个参数作为错误信息抛出

local function add(a,b)
   assert(type(a) == "number", "a 不是一个数字")
   assert(type(b) == "number", "b 不是一个数字")
   return a+b
end
add(10)

执行以上程序会出现一下错误:

lua: test.lua:3: b 不是一个数字
stack traceback:
    [C]: in function 'assert'
    test.lua:3: in local 'add'
    test.lua:6: in main chunk
    [C]: in ?

error(message[,level]
        error的功能是终止正在执行的函数,并返回message的内容作为错误信息(error函数永远都不会返回),通常情况下,error会附加一些错误位置的信息到message头部。
Level参数指示获得错误的位置:
Level=1[默认]:为调用error位置(文件+行号) 
Level=2:指出哪个调用error的函数的函数
Level=0:不添加错误位置信息

pcall(function,parameter)
pcall接收一个函数和要传递给该函数的参数,执行结果无错误则返回true,有错误则返回false,errorinfo,如果参数1中这个函数也会return值,则可以通过定义第二个值来接收

local a = pcall(function(i) print(i) end, 33)
print(a) --true

local b = pcall(function(i) print(i) error('error..') end, 33)
print(b)  --false
local i, v = pcall(function (i) return i end, 33)
print(i, v) --打印出i为true v为33

local i, v = pcall(function (i) end, 33)
print(i, v) --打印出i为true v为nil

pcall以一种“保护模式”来调用第一个参数,因此pcall可以捕获函数执行中的任何错误,通常在错误发生时,希望落得更多的调试信息,而不只是发生错误的位置。但pcall返回时,它已经销毁了调用桟的部分内容。

xpcall(function1,function2,parameter):

Lua提供了xpcall函数,function1为将要执行的函数,xpcall接收第二个参数是一个错误处理函数后面的参数为提供给function1函数的参数,当错误发生时,Lua会在调用桟展开(unwind)前调用错误处理函数,于是就可以在这个函数中使用debug库来获取关于错误的额外信息了。

debug库提供了两个通用的错误处理函数:
1.debug.debug:提供一个Lua提示符,让用户来检查错误的原因
2.debug.traceback:根据调用桟来构建一个扩展的错误消息

function myfunction ()
    n = n / nil
end

function myerrorhandler(err)
    print("ERROR:", err)
end

status = xpcall(myfunction, myerrorhandler)
print(status)
--输出
ERROR:    test2.lua:2: attempt to perform arithmetic on global 'n' (a nil value)
false

 

你可能感兴趣的:(lua)