Lua中处理错误,可以使用函数pcall(protected call)来包装需要执行的代码。
pcall接收一个函数和要传递个后者的参数,并执行,执行结果:有错误、无错误;返回值true或者或false, errorinfo
if pcall(function_name, ….) then -- 没有错误 else -- 一些错误 end
--assert(io.open("nofile"),"this my error");
--print("contine print");--引发错误后程序结束返回
--利用pcall执行封装好的函数代码,pcall会捕获函数中执行的任何错误,如果没有错误,pcall会返回true以及函数调用的返回值,否则,返回false及其错误消息,
--当遇到一个内部错误时候,Lua就会产生错误消息,而其他时候,错误消息就是传递给error函数的值
--pcall返回其错误消息时,它已经销毁了调用栈的部分内容
function foo(str)
print(str);
if type(str) ~= "string"
then
error("string expected",2);--由于函数调用了error,所以lua会认为是函数发生了错误。error函数的第二个参数指出应由调用层级中的哪个层来报告当前的错误,
--也就是说明了谁应该为错误负责
end
end
function errhander( )
print(debug.traceback("获得当前执行的调用栈"));
end
local status,err=pcall(foo,1);--pcall接收一个函数和要传递个后者的参数,并执行
print(status,err);--false string expected
Lua提供了xpcall函数,xpcall接收第二个参数——一个错误处理函数,当错误发生时,Lua会在调用桟展看(unwind)前调用错误处理函数,于是就可以在这个函数中使用debug库来获取关于错误的额外信息了。
debug库提供了两个通用的错误处理函数:- debug.debug:提供一个Lua提示符,让用户来检查错误的原因
- debug.traceback:根据调用桟来构建一个扩展的错误消息
-- 标准lua xpcall不接受函数参数,luajit却可以,这个可以用于切换
xpcall(foo,errhander,"va");
function myfunction (n)
n = n/2
end
function myerrorhandler( err )
print( "ERROR:", err )
end
--[[xpcall(f,err) 函数调用函数 f 同时为其设置了错误处理方法 err,并返回调用函数的状态。
任何发生在函数 f 中的错误都不会传播,而是由 xpcall 函数捕获错误并调用错误处理函数 err,传入的参数即是错误对象本身
--]]
status = xpcall( myfunction , myerrorhandler,10)
print( status)