魏长东

weichangdong

Lua中的错误与异常

Lua中error的处理:Lua经常作为扩展语言嵌入在别的应用中,所以不能当错误发生时简单的崩溃或者退出。相反,当错误发生时Lua结束当前的chunk并返回到应用中。

 

  当Lua遇到不期望的情况时就会抛出错误,你也可以通过调用error函数显式地抛出错误。

 

  当函数遇到异常有两个基本的动作:返回错误代码或者抛出错误。选择哪一种方式,没有固定的规则,不过基本的原则是:对于程序逻辑上能够避免的异常,以抛出错误的方式处理之,否则返回错误代码。

  error函数:显示的抛出一个错误,终止正在执行的函数,并返回错误信息

 

error('wcd')

print('no output') --不会被执行

 

输出:

lua: error.lua:1: wcd

 

  assert函数:如果表达式出现错误,则触发一个错误,返回出错信息

 

  assert首先检查第一个参数,若没问题,assert不做任何事情;否则,assert以第二个参数作为错误信息抛出。第二个参数是可选的。注意,assert会首先处理两个参数,

 

然后才调用函数,所以下面代码,无论n是否为数字,字符串连接操作总会执行:

 

  n = io.read()

 

  assert(tonumber(n), "invalid input: " .. n .. " is not a number")

 

输出:

pls input:

wcd

lua: error.lua:5: invalid input: wcd is not a number

 

 

  pcall函数:在保护模式下调用函数(即发生的错误将不会反射给调用者),当调用函数成功能返回true,

失败时将返回false加错误信息。pcall不会终止函数的继续运行。

我们通过error抛出异常,然后通过pcall捕获之。

这种机制提供了强大的能力,足以应付Lua中的各种异常和错误情况。

pcall返回错误信息时,已经释放了保存错误发生情况的栈信息。

 

local re,err = pcall(wcd2) --wcd2 方法不存在

if not  re then

        print(err)

        print("not go on execute") -- 不会执行

end

 

输出:

lua: error.lua:7: attempt to call global 'wcd' (a nil value)

 

    如果遇到内部错误(比如对一个非table的值使用索引下标访问)Lua将自己产生错误信息,

 否则Lua使用传递给error函数的参数作为错误信息。

 

  xpcall函数:xpcall接受两个参数:调用函数、错误处理函数。当错误发生时,

Lua会在栈释放以前调用错误处理函数,因此可以使用debug库收集错误相关信息。

 

function dealerr()

        print('ppppppp')

print(debug.traceback())

end

local rere = xpcall(wcd,dealerr) --方法是wcd 则返回true

if rere then

        print(rere)

end

 

如果方法是wcd2,就会输出错误信息:

ppppppp

stack traceback:

error.lua:16: in function <error.lua:14>

 

  debug.debug函数:debug处理函数,可以自己动手察看错误发生时的情况。

 

  debug.trackback函数:debug处理函数,过traceback创建更多的错误信息,

也是控制台解释器用来构建错误信息的函数。