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

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