編譯
Lua 雖然是解釋性語言,但 Lua 源碼總是被編譯為中間形式后再執(zhí)行。
dofile 用于載入并執(zhí)行一個 Lua 文件,相比之下,loadfile 用于載入一個 Lua 文件,但并不執(zhí)行,確切的說 loadfile 編譯了一個 chunk,并返回此被編譯的 chunk(被作為一個函數(shù)):
dofile 可以被實現(xiàn)為:
一個類似 loadfile 的函數(shù) load,它使用字符串(而非文件)作為參數(shù),返回被編譯的 chunk:
另外,我們可以使用命令 luac 來直接編譯 Lua 文件:
錯誤
Lua 遇見任何不可接受的條件時會產(chǎn)生錯誤。例如:
我們可以顯式的調(diào)用 error 函數(shù)來產(chǎn)生一個錯誤,error 接受一個錯誤消息作為參數(shù):
assert 函數(shù)也可以產(chǎn)生錯誤。assert 函數(shù)檢查第一個參數(shù)是否為 false,如果不為 false 就返回此參數(shù),如果為 false 就產(chǎn)生一個錯誤。assert 的第二個參數(shù),錯誤消息,是可選的。范例:
pcall 函數(shù)使用保護模式(protected mode)調(diào)用第一個參數(shù)(此參數(shù)為一個函數(shù)),如果被調(diào)用的函數(shù)執(zhí)行不存在錯誤,pcall 返回 true 并返回被調(diào)用函數(shù)的所有返回值,如果被調(diào)用的函數(shù)產(chǎn)生了錯誤,pcall 返回 false 并附帶上錯誤消息。嚴格來說,錯誤消息不一定需要是字符串:
追蹤錯誤
我們先看一個函數(shù):
foo 函數(shù)需要一個字符串參數(shù),我們執(zhí)行上面的代碼:
輸出指出了錯誤出現(xiàn)在 foo 函數(shù)中(因為 foo 函數(shù)調(diào)用了 error),而實際上,錯誤是 foo 的調(diào)用者產(chǎn)生的,而非 foo 產(chǎn)生的。我們可以設(shè)置 level 來修正這個報錯:
error 函數(shù)的第二個參數(shù)為 level,用于指定報錯的位置,level 值為 1 表示 error 的調(diào)用者,值為 2 表示 error 的調(diào)用者的調(diào)用者,以此類推。
pcall 只能返回錯誤消息,很多時候我們需要完整的調(diào)用棧,這時可以使用 xpcall 函數(shù)。xpcall 函數(shù)可以接收一個消息 handler 作為參數(shù),在被調(diào)用函數(shù)出現(xiàn)錯誤時,消息 handler 會被調(diào)用,通過其就可以獲取到當前調(diào)用棧的信息。