Lua 外部代码的加载和异常捕获


--编译与运行Lua外部代码块有三种形式:
--loadfile 编译Lua外部代码块,但不会运行代码,将会以函数的形式返回编译结果。
--dofile 直接编译运行Lua外部代码块,并不返回任何结果。Dofile是loadfile 的进一步简化封装。
--load 编译字符串中的代码,而非从文件读取。


--[[--使用“loadfile"函数,调用lua外部脚本]]
--[[
local externalFile=loadfile("C1_IsInvokedModel.lua")
--local externalFile=loadfile("D://C1_IsInvokedModel.lua")  --使用路径
--测试得到的外部lua变量
print(externalFile)
print("变量的类型: ",type(externalFile))

--调用此函数(本步骤是必须的!)
externalFile()
--调用外部lua文件函数与变量
ShowInfo()          --调用全局函数
--ShowInfoByLocal()   --调用局部函数, 会引发异常
print(num1)         -- 调用全局变量
--print(num2)         -- 调用局部变量, 输出nil (但不会报错)
]]





--[[--使用“dofile"函数,调用lua外部脚本
    --规律: dofile 函数,不返回结果,也无需执行返回结果。
    --      即: 直接编译且运行外部lua脚本
]]
--[[
local externalFile2=dofile("C1_IsInvokedModel.lua")

----测试得到的外部lua变量
print(externalFile2)      --nil
print("变量的类型: ",type(externalFile2))   --变量的类型: 	nil

--调用全局函数
ShowInfo()
--调用全局变量
print(num1)
]]


--[[--学习使用 "load()"函数,直接执行lua代码]]
local result1=load("print('This is lua info')")
--测试
print(result1)
print(type(result1))
--运行返回函数
result1()


--演示 load 函数性质1: 总是在全局环境下编译字符串
--函数性质2: 字符串形式的lua脚本,如果出错,则不会显示错误信息。
num1=1000
local num1=30

fun1=load("num1=num1+1 print(num1)")  --字符串形式的lua脚本
fun2=function() num1=num1+1 print(num1) end

fun1()   --output: 1001
 --本文件定义的函数优先取局部变量
fun2()   --output: 31



--lua语言主要使用 error()/assert() 函数来抛出错误
--使用pcall()/xpcall()来捕获错误。


--[[--学习引发(抛出)错误]]

--使用"error "函数。
local num=123  
--local num=nil

if(not num) then
   error("error:  出现错误了!, 请输入合法数值!")
else
   print("数值合法。 进行下一步")
end

--使用assert() 函数
--assert(a,b)参数a是要检查是否有错误的一个参数,b是a错误时抛出
	--的信息。第二个参数b是可选的
local num=123
--local num=nil

result=assert(num, "Error: 请输出合法数值!")
print(result)


--[[--进一步举例,关于Asset 函数使用。]]
numInput="abc"
res1=tonumber(numInput)
print("res1=",res1)

--改进措施
numInput="10"
res=assert(tonumber(numInput), "发生错误: 请输入一个数值型数据,不要写字符组合!")
print(res)



--[[--使用pcall() 函数,来捕获错误。]]
--pcall函数可以捕获函数执行中的任何错误,如果没有发生错误,那么返
-- 回true及函数调用的返回值,否则返回false及错误信息。
--定义错误函数
function HavaError()
   error({error="本方法有错误发生!"})
end

--捕获异常
local resFlag,errorInfo=pcall(HavaError)
if(resFlag) then
   print("正确执行代码!")
else
   print("发生错误: ",errorInfo.error)
end


--[[--使用xpcall() 函数,来捕获错误。]]
--如果希望我们捕获错误信息,且显示完整的堆栈错误信息,则需要使用xpcall 函数。
--xpcall ()函数必须输入两个函数,前者是可能引发错误的函数,后者是错误处理函数。

--错误事件源
function HavaError()
   error({error="本方法有错误发生!"})   --去掉注释,表示本函数,不会出现错误。
end

--错误的处理函数(如何处理错误)
function ProcessError()
   print("发生错误: ,详细堆栈信息如下: ")
   print(debug.traceback())
end

--捕获错误信息
local procFlag=xpcall(HavaError, ProcessError)
if(procFlag) then
   print("正确执行语句")
end
print("后续语句,继续运行....")



--[[--lua的垃圾收集机制]]
print(collectgarbage("count"))  --显示lua占用的总内存数  [以k字节为单位]

print("开始给Table填充大量数据")
myTable={}
for i = 1, 100000 do
    myTable[i]=i
end
print("给Table填充大量数据完毕! ")
print(collectgarbage("count"))  --显示lua占用的总内存数

--Table 资源释放
myTable=nil
print(collectgarbage("count"))  --显示lua占用的总内存数
--强制进行垃圾收集处理
collectgarbage("collect")
print(collectgarbage("count"))  --显示lua占用的总内存数

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值