编译
函数dofile和函数loadfile都是加载文件进行编译
dofile
:加载错误,返回异常
loadfile
:只返回错误码,不抛出异常
function dofile (filename)
local f = assert(loadfile(filename ))
return f()
end
函数load
与函数loadfile
类似,不同之处在于该函数从一个字符串或函数中读取代码段,而不是从文件中读取
f = load("i = i + 1")
代码执行后,f就会变成被调用执行i=i+1
的函数
--等价于
f = function()
i = i + 1
end
i = 0
f(); print(i) -->1
f(); print(i) -->2
注意: 该函数开销大,会引起问题
如果代码有问题会返回nil
和错误信息
函数load
在编译时不涉及词法定界
i = 32
local i = 0
f = load("i = i + 1; print(i)")
g = function () i = i + 1; print(i) end
f() --> 33
g() --> 1
函数g像我们所预期地那样操作局部变量i,但函数f操作的却是全局变量i,这是由于函数load总是在全局环境中编译代码段。
错误处理和异常
当发生错误时,使用函数pcall
来封装代码
local ok, msg = pcall(function ()
some code
if unexpected_condition then error()end
some code
print(a[i]) --潜在错误:'a'可能不是一个表
some codeend
end)
if ok then --执行被保护的代码时没有错误发生
regular code
else --执行被保护的代码时有错误发生:进行恰当的处理
error-handling code
end
函数pcall
会以一种保护模式来调用它的第1个参数,以便捕获该函数执行中的错误。无论是否有错误发生,函数pcall
都不会引发错误。如果没有错误发生,那么pcall
返回true及被调用函数(作为pcall的第1个参数传入)的所有返回值;否则,则返回false及错误信息。
todo