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佔用的總內存數

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章