Lua 异常处理,Lua异常处理有 pcall 和 xpcall ,两个接口都能终止主函数的执行,区别是 xpcall 可以放进一个错误处理函数,当xpcall执行主函数出错时,通过错误处理函数将出错的详细信息打印出来。简单的说 pcall 只是终止了主函数的执行,没有打印出错的详细信息,xpcall 不仅可以终止主函数的执行,还能通过指定的错误接口来处理出错的信息。
A、下面是pcall调用主函数没有出错的情况:
function sum(a,b)
local c=a+b
print(c)
return c
end
local status,ret_info = pcall(sum,1,2)
print('status=',status,'ret_info=',ret_info)
输出是 :
3
status= true ret_info= 3
B、下面是pcall调用主函数出错的情况:
function sum(a,b)
local c=a+b+'d'
print(c)
return c
end
local status,ret_info = pcall(sum,1,2)
print('status=',status,'ret_info=',ret_info)
输出是:
status= false ret_info= input:2: attempt to perform arithmetic on a string value
总结pcall可以看出,当执行主函数没出错的时候,status为true,ret_info 就是主函数的返回值,当执行主函数出错的时候,
status为false,ret_info 就是出错的简略信息。
C、下面是xpcall调用主函数没有出错的情况:
function sum(a,b)
local c=a + b
print(c)
return c
end
local status,ret_info = xpcall(sum,debug.traceback,1,2)
print('status=',status,'ret_info=',ret_info)
输出结果:
3
status= true ret_info= 3
D、下面是xpcall调用主函数出错的情况:
function sum(a,b)
local c = a + b + 'd'
print(c)
return c
end
local status,ret_info = xpcall(sum,debug.traceback,1,2)
print('status=',status,'ret_info=',ret_info)
输出结果:
status= false ret_info= input:2: attempt to perform arithmetic on a string value
stack traceback:
input:2: in function ‘sum’
[C]: in function ‘xpcall’
input:7: in main chunk
[C]: in function ‘pcall’
demo.lua:49: in main chunk
[C]: in ?
总结xpcall可以看出,当执行的主函数没有出错的时候,pcall 和 xpcall 是一样的返回结果,但当执行的主函数出错的时候,
xpcall 打印的消息会更详细,因为我传入的是debug.traceback 接口,所以打印了debeg的相关信息出来,这个debug.traceback 可以自定义自己的错误处理接口。
E、下面就是自己定义的一个错误处理函数:
function sum(a,b)
local c = a + b + 'd'
print(c)
return c
end
function MyDebug()
print('call sum function fail ...')
end
local status,ret_info = xpcall(sum,MyDebug,1,2)
print('status=',status,'ret_info=',ret_info)
输出结果:
call sum function fail …
status= false ret_info= nil
可以看出,当主函数出错的时候,调用了自定义的 MyDebug 接口,打印了自定义的出错日志。
Lua中的异常处理主要通过pcall和xpcall实现。pcall在出错时只返回错误信息,而xpcall允许设置自定义错误处理函数,提供更详细的错误堆栈信息。当主函数执行成功时,两者返回结果相同;出错时,xpcall能提供更丰富的调试信息。
2502

被折叠的 条评论
为什么被折叠?



