lua2.1的错误处理机制笔记(编辑中)

本文探讨Lua2.1中的错误处理机制,详细介绍了9种错误类型及其处理过程,包括错误处理函数的作用及异常处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文将探讨lua2.1的错误处理机制,在讲述的过程中涉及到一些lua2.1的指令,如果不熟悉这些指令的读者可以先阅读"lua2.1的指令笔记"

 

1、错误的类型

在lua2.1中有一个全局的数组叫lua_fallback,这是一个全局数组,这个数组上的元素的数量是9,也就是说再lua2.1中一共有9种错误类型,如下:

 

 

FB_ERROR  (调用lua_message而产生)

FB_INDEX   (值为1,在某关联数组某索引对应的对象不存在)

FB_GETTABLE  (值为2,栈顶元素不是关联数组)

FB_ARITH    (值为3,如果在算术操作的时候有操作数不能转化为数字对象)

FB_ORDER  (值为4,再对比大小指令中两个操作对象至少有一个不是数字对象,且有对象不能转化为字符串)注:在对比操作中,如果

   两个 操作对象中至少有一个不是数字对象的时候则尝试将两个对象转化为字符串。

FB_CONCAT  (值为5,如果在连接字符串操作中有操作对象不能转化为字符串)

FB_SETTABLE  (值为6,为一个不是关联数组的对象存如key-value)注:这个错误可能在STOREINDEXED或STOREINDEXED0指令中

产生。

FB_GC (值为7,在垃圾回收的时候产生的错误,暂无解释)

FB_FUNCTION (值为8,尝试执行一个不是函数对象的对象)

 

 

2、错误处理的过程

在lua2.1中文件fallback.h和fallback.c实现了错误处理的过程。

 

FB_ERROR:调用lua_message()函数就能够就能发出这个错误,而在对应的具体的错误处理过程在函数errorFB中完成

 

FB_INDEX:对应的具体错误处理过程在indexFB函数中实现,这个函数只是将一个nil对象放置到栈顶

 

FB_GC:在lua2.1中暂时还没有对这个错误做相应的处理

 

以上三种错误都有各自比较特殊的处理方式,而剩下的则最终都是调用了函数lua_reportbug,下面我们仔细看一下这个函数:

 

如果是调试行(debugline)不是0

如果函数栈不为空

将栈中的每个函数的信息都打印到一个缓冲区中(文件名,执行到第几行),并且将栈清空

否则

打印但前行和当前文件打印到一个缓冲区中

 

注:“调试行”这个概念暂时无解释

 

在指定的缓冲区中组织好出错信息之后,lua2.1则调用lua_error输出这个信息,lua_error做了下面一些动作:

1)将错误信息压到栈顶

2)如果在lua_error之前曾经做过setjmp(C语言的api),那么就会用longjmp进行跳转。否则通过exit(1)推出程序。

 

通过查找setjmp我们知道这个函数会在两函数中进行调用:

do_protectedrun和do_protectedmain,这两个函数算是我们执行某个函数和文件的时候的主要入口,lua2.1选择

在这两个函数内部做了一个异常处理,上面说的longjmp其实就是会跳回这两个函数中来。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值