《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