《Programming in Lua 3》读书笔记(七)

本文深入探讨Lua中的错误处理机制,包括assert函数的使用、load与dofile函数的区别,以及error函数如何报告错误位置。同时,解析Lua opcode与预编译代码的优势。

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

Compilation,Executioin,and Errors

Lua的assert函数:assert(v,mess)
相当于C的断言,当v为nil或者false将触发错误,mess为发生错误时返回的信息

dofile函数不仅会加载chunk(语句快),并且会运行,而loadfile只会加载chunk,但会将语句快作为一个function返回
相比较于dofile函数,loadfile函数有返回值,便于我们处理错误,并且适合多次调用,因为可以将loadfile函数的返回值作为一个函数赋值给变量,多次重复调用的时候可以直接调用赋值了的变量。

load 
没有到必须要用该函数的时候不要使用这个函数;load也会返回nil值:
e.g. 
f = load("i = i + 1")
f = function () i = i + 1 end

第二个语句比第一个语句的运行速度更快,因为Lua编译function的时候使用enclosing chunk,而load并没有使用所谓的lexical scoping(词法定界)来编译,load总是在全局环境中编译语句快。
e.g.
i = 32
local i = 0
f = load("i = i + 1;print(i)")
g = function () i = i + 1;print(i) end
f()               -- 33
g()              -- 1

 
大多数使用load函数的情况是在加载外部

加载了一个语句快并不意味着定义了语句快内的函数

预编译代码能带来更快的加载速度和对代码的保护机制。

Lua opcode

error函数
函数的返回值是个string类型,包含:文件名+代码所在的行+预定义的msg
eg.
error("error")               --msg = error
另外函数可以传递第二个参数,可以控制报告错误所在的位置:书中提到,有的时候不是某个函数出了问题,而是调用该函数的方式或者传递的参数不符合预订要求,此时错误的位置应该是调用的地方而不是定义的地方。参数默认为1,表示报告错误的地方在函数定义
e.g.
function foo(str)
     if type(str) ~= "string" then
          error("string expected")
     end
end
foo(1)
此时error函数报告的错误行为 error("string expected") 所在的行

function foo(str)
     if type(str) ~= "string" then
          error("string expected",2)
     end
end
foo(1)
此时error函数报告的错误行为foo(1) 所在的行;此处error函数的第二个参数为2表示错误报告的地方在调用该函数的地方。


traceback(回溯),结合xpcall函数使用,debug.debug

 

转载于:https://www.cnblogs.com/zhong-dev/p/4044579.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值