Lua 错误处理

news2024/11/9 6:06:49

Lua 错误处理

参考至菜鸟教程。

  程序运行中错误处理是必要的,在我们进行文件操作,数据转移及web service 调用过程中都会出现不可预期的错误。如果不注重错误信息的处理,就会造成信息泄露,程序无法运行等情况。

  任何程序语言中,都需要错误处理。错误类型有:

  • 语法错误
  • 运行错误

语法错误

  语法错误通常是由于对程序的组件(如运算符、表达式)使用不当引起的。一个简单的实例如下:

-- test.lua 文件
a == 2

运行结果:

效果图

  正如你所看到的,以上出现了语法错误,一个 “=” 号跟两个 “=” 号是有区别的。一个 “=” 是赋值表达式两个 “=” 是比较运算。

  另外一个实例:

for a= 1,10
   print(a)
end

运行结果:

效果图

  语法错误比程序运行错误更简单,运行错误无法定位具体错误,而语法错误我们可以很快的解决,如以上实例我们只要在for语句下添加 do 即可:

for a= 1,10
do
   print(a)
end

运行错误

  运行错误是程序可以正常执行,但是会输出报错信息。如下实例由于参数输入错误,程序执行时报错:

function add(a,b)
   return a+b
end

add(10)

  当我们编译运行以下代码时,编译是可以成功的,但在运行的时候会产生如下错误:

效果图

  lua 里调用函数时,即使实参列表和形参列表不一致也能成功调用,多余的参数会被舍弃,缺少的参数会被补为 nil。

  以上报错信息是由于参数 b 被补为 nil 后,nil 参与了 + 运算。

  假如 add 函数内不是 “return a+b” 而是 “print(a,b)” 的话,结果会变成 “10 nil” 不会报错。

错误处理

  我们可以使用两个函数: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以第二个参数作为错误信息抛出。

error函数

语法格式:

error(message [, level])

功能:终止正在执行的函数,并返回message的内容作为错误信息(error函数永远都不会返回)。

通常情况下,error会附加一些错误位置的信息到message头部。

Level参数指示获得错误的位置:

  • Level=1[默认]:为调用error位置(文件+行号)
  • Level=2:指出哪个调用error的函数的函数
  • Level=0:不添加错误位置信息

pcall和xpcall、debug

  Lua中处理错误,可以使用函数pcall(protected call)来包装需要执行的代码。

  pcall接收一个函数和要传递给后者的参数,并执行,执行结果:有错误、无错误;返回值true或者或false, errorinfo。

  语法格式如下:

if pcall(function_name,...) then 
    -- 没有错误
else
    -- 一些错误
end

  简单实例:

print(pcall(function(i) print(i) end, 33))

print(pcall(function(i)  print(i) error('error..') end, 33))

function f() 
    return false,2 
end

if f() then 
    print '1' 
else 
    print '0' 
end

输出结果:

效果图

  pcall以一种"保护模式"来调用第一个参数,因此pcall可以捕获函数执行中的任何错误这也就意味着不会有任何错误抛出,pcall是通过返回值返回错误。而且程序的运行不会被中止,从0被输出即可看出。

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

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

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

  • debug.debug:提供一个Lua提示符,让用户来检查错误的原因。
  • debug.traceback:根据调用桟来构建一个扩展的错误消息。

实例1:

print(
    xpcall(
    function(i) print(i) error('error..') end, 
    function() print(debug.traceback()) end, 
    33)
)

输出结果:

效果图

实例2:

function myfunction ()
    n = n/nil
end
 
function myerrorhandler( err )
    print( "ERROR:", err )
end
 
status = xpcall( myfunction, myerrorhandler )
print(status)

输出结果:

效果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/185339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 权限变更操作失误,执行了 chmod -Rf 777 / 如何急救

昨天手贱,执行命令的时候输错了,结果输入了以下命令: chmod -Rf 777 /可想而知,得到的回报惊人哈哈,我现在之所以还笑的出来,是因为折腾了半天已经修复了这个问题了。 先来复盘一下问题解决的过程吧 错误…

华为交换机、路由器设备怎样配置console登录密码

华为交换机路由器设备怎样配置console密码 在对路由器交换机等网络进行管理中,为了安全起见经常需要为设备配置登录密码,尤其是使用串口线直连设备时。 console线路密码认证有两种方式:1,只配置password(密码&#x…

iTOP-RK3568开发板学习笔记(1)编译+烧录系统

迅为 RK3568 开发板学习笔记 文章目录准备开发环境复制 Linux SDK编译 Buildroot烧录固件准备开发环境 将 ITOP-RK3568 资料包中的虚拟机开发环境解压到自己的电脑上, 扩展虚拟机系统的硬盘大小,越大越好( SDK 太大了,后面有提及…

【C++】特殊类设计

​🌠 作者:阿亮joy. 🎆专栏:《吃透西嘎嘎》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉设计一个…

第九层(7):STL之list

文章目录前情回顾list概念优缺点构造函数赋值函数交换函数容器和大小操作插入操作删除操作单个数据访问反转操作排序下一座石碑🎉welcome🎉 ✒️博主介绍:一名大一的智能制造专业学生,在学习C/C的路上会越走越远,后面不…

C++——map|set2

目录 map::operator[] [ ]的实现 multimap 习题 前K个高频单词 两个数组的交集 底层结构 pair有俩个成员一个是first,一个是second 由于pair有俩个模板参数,第一个是first,一个是second map的insert参数类型是valud_type,value_type就是pair …

PNG免抠素材网,免费商用,设计师赶紧马住。

本期分享设计师必备的免抠素材网站,建议收藏! 1、菜鸟图库 https://www.sucai999.com/searchlist/66008.html?vNTYwNDUx 网站主要分享设计类素材为主,有平面海报、UI素材、电商素材、免抠素材、背景图片等等。其中免抠元素数量就非常可观&a…

uniapp项目

目录 一、HBuilder创建项目 二、引入uView 2.1 npm方式安装 2.2 下载方式安装 三、小程序的分包 三、App.vue中的生命周期 四、工具封装 五、api接口请求封装 六、store 七、加载顺序 八、flex的使用 一、HBuilder创建项目 文件--新建--项目--默认模板--Vue2--创建 …

CRLFsuite:一款功能强大的CRLF注入扫描工具

关于CRLFsuite CRLFsuite是一款功能强大的CRLF注入扫描工具,在该工具的帮助下,广大研究人员可以轻松扫描和识别目标应用程序中的CRLF注入漏洞。 关于CRLF 回车换行(CRLF)注入攻击是一种当用户将CRLF字符插入到应用中而触发漏洞…

“华为杯”研究生数学建模竞赛2005年-【华为杯】A题:排队论模型解决出租车最佳数量预测(附获奖论文)

赛题描述 A: Highway Traveling time Estimate and Optimal Routing Ⅰ Highway traveling time estimate is crucial to travelers. Hence, detectors are mounted on some of the US highways. For instance, detectors are mounted on every two-way six-lane highways o…

jsp 大学生心理平台系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp大学生心理平台系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统采用web模式开发,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境 为TOMCAT7.0,Myeclipse8.5开发&#x…

正点原子STM32(基于HAL库)4

目录ADC 实验ADC 简介单通道ADC 采集实验ADC 寄存器硬件设计程序设计(还没拷贝完)单通道ADC 采集(DMA 读取)实验ADC & DMA 寄存器硬件设计多通道ADC 采集(DMA 读取)实验ADC 寄存器硬件设计单通道ADC 过采样(16 位分…

【数据结构初阶】第二篇——顺序表

顺序表的概念及其结构 初始化顺序表 销毁顺序表 打印顺序表 增加数据 头插 尾插 指定下标位置插入 删除数据 头删 尾删 删除指定位置 查找数据 修改数据 顺序表的概念及其结构 基本概念 顺序表是用一段物理地址连续的存储单元一次存储数据元素的线性结构&#xf…

Word控件Spire.Doc 【Table】教程(6): 在 Word 中合并或拆分表格单元格

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

AcWing 1072. 树的最长路径(DFS与树形DP)

AcWing 1072. 树的最长路径(树形DP)一、题目:二、思路:三、代码:四、树形DP1、状态表示2、状态转移3、循环设计4、初末状态5、代码实现一、题目: 二、思路: 为了方便,我们利用下面这…

Vue3现状—必然趋势?

文章目录🌟 专栏介绍🌟 Vue默认版本🌟 拥抱Vue3的UI🌟 Vue3显著优势🌟 专栏介绍 凉哥作为 Vue 的忠诚粉丝输出过大量的 Vue 文章,应粉丝要求开始更新 Vue3 的相关技术文章,Vue 框架目前的地位大…

Python爬虫之Scrapy框架系列(8)——XXTop250电影所有信息同时存储到MySql数据库

现在又不满足于只保存在本地txt文本了,所以来试试存储到数据库mysql里怎么搞呢?(首先,要准备好mysql数据库以及navicat数据库可视化管理工具) 目录:分析:如何同时存储到本地txt文本以及mysql数据…

回溯详解 LeetCode 46. 全排列 51. N 皇后 52. N皇后 II

🌈🌈😄😄 欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 46. 全排列 51. N 皇后 52. N皇后 II,做好准备了么,那么开始吧。 🌲🌲🐴🐴 46. 全…

Word处理控件Aspose.Words功能演示:如何在 C# 和Java中将 DOC 转换为 JSON

Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。此外, Aspose API支持流行文件格式处…

kvm磁盘管理

kvm磁盘管理虚拟磁盘类型rawqcow2qemu-img常用参数主要参数:查看磁盘信息--info创建磁盘文件--create磁盘容量调整--resize磁盘增加容量磁盘缩小容量(生产环境下禁止操作)磁盘调整容量到指定大小转换磁盘格式--convert检查磁盘镜像在线热添加磁盘附加磁盘到vm实例--…