【Lua学习x】错误处理

错误处理

参考文档地址

  • Lua所遇到的任何未预期条件都会引发一个错误。 因此在发生错误时不能简单的崩溃或着退出,而是结束当前程序块并返回应用程序。当错误引发时进行恰当的处理是最合适的,然而这个阶段伴随着错误的捕获、错误的处理、错误追溯等处理
  • Lua中有函数pcall、error、assert函数来操作错误。其中pcall用于捕获错误、error抛出一个错误、assert是error的包装

抛出错误 - error和assert

  • 在Lua中抛出错误信息的函数是error,通常包含调用堆栈信息以及错误提示信息。而assert是error的包装,它有两个参数可选,第一个参数如果返回false,那么就引发错误,抛出错误提示信息给第二个参数。因此使用assert要比error更为简便

  • 两种方式都是可以的,而且可以自定义错误信息,简便快捷的跟踪错误位置及错误模块

--errot
n=nil
if (not n) then
error("这行发生错误")
end

--assert
local function add(a,b)
	assert(type(a)=="number","a不是一个数字")
	assert(type(b)=="number","b不是一个数字")
end
add("a")
test3.lua:106: 这行发生错误

lua: test3.lua:102: a不是一个数字

捕获及处理错误 - pcall

  • 抛出错误会引发程序停止执行,那么如何在发现错误的情况下继续程序的运行呢?pcall函数为程序的异常处理提供了很好的支持,它让可能会发生错误的程序在安全的环境内执行,如果发生错误,那么程序不停止,可根据需要去调用自定义错误处理。
  • pcall函数在以一种“安全模式”来调用它的第一个参数,它可以捕获函数执行中的任何错误,如果没有发生错误,那么返回true及函数调用的返回值否则返回false及错误信息。当然错误信息不一定是一个字符串,还可以是lua中的任何值。
--Pcall返回两个值
--第一个值:无错误返回true,反之返回false
--第二个值:在第一个值为false的基础上 返回错误信息
function fun()
	error("error")
end
isRun,errorMessage=pcall(fun)
if isRun then
	print("程序可以运行")
else
	print("错误为:"..errorMessage)
end
print("Running")
错误为:test3.lua:101: error
Running

错误消息与追溯 - xpcall

  • pcall以一种"保护模式"来调用第一个参数,因此pcall可以捕获函数执行中的任何错误。

  • 通常在错误发生时,希望落得更多的调试信息,而不只是发生错误的位置。但pcall返回时,它已经销毁了调用桟的部分内容。

  • Lua提供了xpcall函数,xpcall接收第二个参数——一个错误处理函数,当错误发生时,Lua会在调用桟展开(unwind)前调用错误处理函数,于是就可以在这个函数中使用debug库获取关于错误的额外信息了。

  • debug库提供了两个通用的错误处理函数:

    • debug.debug:提供一个Lua提示符,让用户来检查错误的原因
    • debug.traceback:根据调用桟来构建一个扩展的错误消息
function fun()
	n=n/nil
end
function fun1(err)
	print(err)
	--print(debug.traceback())
	--print(debug.debug())
end

isRun =xpcall(fun,fun1)
if isRun then
	print("可以运行")
end
print("Running")
test3.lua:114: attempt to perform arithmetic on global 'n' (a nil value)
Running
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值