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

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

 两种方式都是可以的,而且可以自定义错误信息,简便快捷的跟踪错误位置及错误模块。
function add(a,b)return a+b
endadd(10)

lua.exe: …sers/Administrator/IdeaProjects/untitled1/Error2.lua:2: attempt to perform arithmetic on local ‘b’ (a nil value)
stack traceback:
…sers/Administrator/IdeaProjects/untitled1/Error2.lua:2: in function ‘add’
…sers/Administrator/IdeaProjects/untitled1/Error2.lua:5: in main chunk
[C]: ?
02.错误处理
们可以使用两个函数:assert 和 error 来处理错误。实例如下:

local function add(a,b)assert(type(a) == "number", "a 不是一个数字")assert(type(b) == "number", "b 不是一个数字")return a+b
end
add(10);
--实例中assert首先检查第一个参数,若没问题,assert不做任何事情;否则,assert以第二个参数作为错误信息抛出。

lua.exe: …sers/Administrator/IdeaProjects/untitled1/Error2.lua:3: b 不是一个数字
stack traceback:
[C]: in function ‘assert’
…sers/Administrator/IdeaProjects/untitled1/Error2.lua:3: in function ‘add’
…sers/Administrator/IdeaProjects/untitled1/Error2.lua:6: in main chunk
[C]: ?
01.error
error(message [, level])

  • 功能:终止正在执行的函数并返回消息的内容作为错误信息,通常情况error会附加一些错误位置的信息到message的头部。
  • 参数:
    • level 指示获得错误的位置
    • level=0 不添加错误位置信息
    • level=1 默认为调用error位置,形式为文件+行号
    • level=2 指出哪个调用error的函数的函数

      02.assert
      assert(v [, message])
      – v 检查是否有错误,当为false或nil时抛出错误。
      –message 可选 错误信息,当检查出有错误是抛出的信息,默认值为assertion failed!


      断言就是用于在代码中捕捉这些假设,可将断言看做是异常处理的一种高级形式。断言表示为一些布尔表达式,程序员相信在程序中某个特定点,该表达式值为真。可以在任何时候启用和禁用断言验证。因此可在测试时启动断言,而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题是可重新启用断言。断言只有在debug模式下才有效。
      03.pcall()
      在Lua中处理错误,必须使用函数pcall(protected call)来包装需要执行的代码。pcall接收一个函数和要传递给后者的参数并执行。
      pcall以一种“保护模式”来调用第一个参数,可同时捕获函数执行中的任何错误和异常。若被执行函数一切正常,pcall返回true以及被执行函数函数的返回值,否则返回nil和错误信息。也就是说成功仅仅有一个返回值,而失败则有两个返回值。
      call接收一个函数和要传递给后者的参数,并执行,执行结果:有错误、无错误;返回值true或者或false, errorinfo。

04.通常在错误发生时,希望获得更多的调试信息,而不只是发生错误的位置。但pcall返回时已经销毁了调用栈的部分内容,Lua提供了xpcall来实现这个功能。
xpcall(func, handler)
Lua提供了xpcall函数接收的第二个参数是一个错误处理的函数,当错误发生时,Lua会在调用栈展看unwind前调用错误处理函数,于是就可以在这个函数中使用debug库来获取关于错误的额外信息。

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

debug.debug 提供一个Lua提示符让用户来处理错误的原因
debug.traceback 根据调用栈来构建一个扩展的错误消息

19.错误(error)相关推荐

  1. TensorRT升级错误,plugins/poly_layer.h:19:21: error: looser throw specifier for ‘virtual int nvinfer1::

    在将tensorrt由7升级到8的过程中,遇到了如下错误 In file included from plugins/poly_layer.cpp:1:0: plugins/poly_layer.h: ...

  2. html5网站 500.19错误,WIN7操作系统创建IIS后浏览时提示HTTP500.19错误是怎么回事?如何解决?...

    WIN7操作系统创建IIS后浏览时提示HTTP500.19错误是怎么回事?如何解决? 作者:兴邦开发部 人气: 发表时间:2015年05月18日 [文章内容简介]:WIN7操作系统创建IIS后浏览时提 ...

  3. 配置网站之后500.19错误

    HTTP错误 500.19 - Internet Server Error 无法访问请求的页面,因为该页的相关配置数据无效. IIS,出现这个错误 怎么回事? -------------------- ...

  4. index.tsx:19 Uncaught Error: A <Route> is only ever to be used as the child of <Routes> element, nev

    今天做练习react路由出现错误,index.tsx:19 Uncaught Error: A is only ever to be used as the child of element, nev ...

  5. c语言错误2064,VC错误: error C2064: term does not evaluate to a function

    VC错误: error C2064: term does not evaluate to a function0 grcfhl2013.11.03浏览34次分享举报 一个求矩形,圆形,三角形的面积的程 ...

  6. java初始化虚拟机错误_异常 - 虚拟机初始化错误 - Error occurred during initialization of VM...

    1 环境配置信息 1.1 服务器配置信息 服务器是物理机, 配置信息如下: CPU型号 CPU个数 CPU核数 CPU线程数 内存 Intel(R) Xeon(R) CPU E5-2630 v4 @ ...

  7. Visual Stdio VS 错误 error : 0xC00000FD: Stack overflow. 更改堆栈空间解决栈溢出问题

    Visual Stdio VS 错误 error : 0xC00000FD: Stack overflow. 更改堆栈空间解决栈溢出问题 参考文章: (1)Visual Stdio VS 错误 err ...

  8. Jenkins的错误“error fetching remote repo origin”的问题解决

    Jenkins的错误"error fetching remote repo origin"的问题解决 参考文章: (1)Jenkins的错误"error fetching ...

  9. mysql 错误1136_mysql,_MySQL错误:Error Code: 1136,mysql - phpStudy

    MySQL错误:Error Code: 1136 我有一张数据表,表结构如下: CREATE TABLE IF NOT EXISTS `icy_car` ( `car_id` bigint(20) N ...

  10. 错误 error C2220: 警告被视为错误 - 没有生成“object”文件

    VS2017编译报错: 错误如下: 错误 error C2220: 警告被视为错误 - 没有生成"object"文件 解决方案: 方法:选中项目->右击->选择[属性] ...

最新文章

  1. oracle同时更新多列数据,ORACLE 11G 表联合更新多列
  2. php执行zip压缩,PHP执行zip与rar解压缩方法实现代码
  3. Java反射 field
  4. fedora 19 gnome 3.8 关闭笔记本盖子的动作
  5. 美食博主整本菜譜全記錄
  6. 设置文本输入框光标位置,兼容ie,w3c
  7. 下载各种在线视频及字幕
  8. gitlab 远程仓库回退到指定版本
  9. container html css,splitcontainer
  10. 数据挖掘 文本分类(四)批处理分词
  11. mysql 给库赋权,Mysql数据库安装、赋权
  12. 华为商城抢购插件_有赞商城社群接龙全面上线,社群营销玩法升级
  13. 领先招聘和支付平台Deel筹资1.56亿美元,成为独角兽企业
  14. 计算机不学c语言的专业,关于高职计算机类专业学生学不好C语言的思考
  15. 具备3-5年工作经验的软件测试工程师,工资大概多少?
  16. Modern GMT Series:Slice in 3D View (三维切片图)
  17. 施工部署主要不包括_施工管理目标是单位工程施工部署的重要内容,其目标不包括()。A.质量目标B.社会行为目标C.工期目标...
  18. android 普通蓝牙源码解读
  19. 如何导出:swc、swf、fla内的声音文件
  20. 啃完这些 Spring 知识点,我竟吊打了阿里面试官(附面经 + 笔记)

热门文章

  1. 新概念英语第一册(27)
  2. jupyter notebook字体、颜色配置
  3. 华为nova3i能用鸿蒙吗,华为Nova3支持红外功能吗 Nova 3支持NFC功能吗
  4. SpringCloud之Zuul网关服务
  5. 如何拼接多张图片?推荐三种方法!
  6. js禁用tab键\Enter键
  7. android ANR
  8. 为末日做准备:谷歌推出僵尸生存地图
  9. org.springframework.util.xml.SimpleSaxErrorHandler warning org.xml.sax.SAXParseException; systemId:
  10. 专注创新 共创未来——2021南大通用产品发布暨生态合作伙伴大会成功举办