一个老大爷上车没人给他让座,他就一直站在我旁边叨叨什么世风日下啊,过了两站路我实在忍受不了了,站起来给他让座,他居然不坐,我让他别客气,他说:我TMD不会开车和你客气个什么...
如果需要在lua中处理错误,必须使用函数pcall来包装需要执行的代码。
pcall接收一个函数和要传递的参数,并执行,执行结果:有错误和无错误;返回值为true或者false,errorinfo。例:
local fun = function( ... )
local a = 1;
print( a + 1 );
return a + 1;
end
tryCatch = function( fun )
local ret, errMessage = pcall( fun )
print( "ret:" .. ( ret and "true" or "false" ) .. " \nerrMessage:" .. ( errMessage or "null" ));
end
trCatch( fun );
上面这个例子,如果fun函数执行正常,则返回true, 执行有误,则返回false和错误信息。pcall以一种保护模式来调用第一个参数,因此pcall可以捕获函数执行中的任何错误。
通常在错误发生时,希望得到更多的调试信息,而不只是发生错误的位置。但pcall返回时,它已经销毁了调用的栈的部分内容。lua提供了xpcall函数,xpcall接收第二个参数——一个错误处理函数,当错误发生时,lua会在调用栈展看前调用错误处理函数,于是就可以在这个函数中使用debug库来获取关于错误的额外信息了。
接着上面的例子写:
xTryCatchErrorInfo = function ()
print(debug.traceback());
end
xTryCatch = function( fun )
local ret, errMessage = xpcall( fun, xTryCatchGetErrorInfo);
print( "ret:" .. (ret and "true" or "false") .. " \nerrMessage:" .. (errMessage or "null"));
end
xTryCatch( fun );
上面的例子中有用到debug.traceback函数,这个函数是根据调用栈来构建一个扩展的错误消息。对于debug库还有一个比较常用的函数,debug.debug,这个函数提供一个lua提示符,让用户来价差错误的原因。
例如使用debug.traceback()函数得到的打印信息如下:
stack traceback:
/Users/xiaowu/Desktop/testPacll.lua:17: in function 'xTryCatch'
/Users/xiaowu/Desktop/testPacll.lua:26: in main chunk
[C]: ?
本文参考lua手册 http://www.lua.org/manual/5.3/manual.html