lua中的错误处理

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)

你可能感兴趣的:(lua中的错误处理)