• 友链

  • 首页

  • 文章归档
h u a n b l o g
h u a n b l o g

欢

HI,Friend

04月
20
Lua

Lua编译和执行错误

发表于 2022-04-20 • 字数统计 1221 • 被 1,558 人看爆

编译

函数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

分享到:
Lua模块和包
Lua位和字节
  • 文章目录
  • 站点概览
欢

网红 欢

你能抓到我么?

Email RSS
看爆 Top5
  • mac系统版本与Xcode版本有冲突 4,080次看爆
  • JAVA_HOME环境配置问题 3,730次看爆
  • AssetBundle使用 3,499次看爆
  • VSCode配置C++开发环境 3,257次看爆
  • Lua反射 3,133次看爆

Copyright © 2025 欢 粤ICP备2020105803号-1

由 Halo 强力驱动 · Theme by Sagiri · 站点地图