標籤:lua 異常
dofile讀入檔案編譯並執行,真正完成功能的函數是loadfile;與dofile不同,loadfile僅僅是編譯代碼成中間碼,並且把編譯後的chunk作為函數返回。如果發生錯誤,返回nil和錯誤資訊。我們可以這麼定義dofile:function dofile(filename) local f = assert(loadfile(filename)) return f()end
如果你只調用一次,可以使用dofile(filename),如果是調用多次,可以f = loadfile(filename); f();f()...
loadstring與loadfile相似,只不過他是從一個串中讀入。
lua中函數定義發生在運行時而不是編譯時間。
f = loadstring("i=i+1")與f = function() i = i+1 end等價。但loadstring不關心詞法範圍:
i = 33local i = 0;f = loadstring("i=i+1")g = function() i = i+1 endg使用的是局部變數i,而f使用的是全域變數i,因為f總是在全域環境下編譯。
犯錯是人的本性,因此我們必須以最佳的方式來處理錯誤。lua作為擴充語言,經常嵌入到其他應用,當錯誤發生時,不能簡單的crash或exit。print "enter a number:"
n = io.read("*number")
if not n then error("invalid input") end
if not condition then error end 的組合太普遍了以至於lua專門內建了一個函數來做這工作,這個函數就是assert。
通常,當異常發生時,你有兩個方式處理,要麼返回錯誤碼(nil),要麼報錯(error)。對於這兩種方式,並沒有固定的準則來做選擇。但是我們提供通用的原則:容易避免的異常應該報錯,否則返回異常。舉例說明:math.sin接受個number型的弧度值,如果參數不是number,我們應該報錯,而不是返回錯誤碼。假設我們是返回錯誤碼,那麼我們使用就得這樣:local res = math.sin(x)if not res then <error handling>其實,我們可以很容易地檢測這個異常,在調用sin之前:if not tonumber(x) then <error handling>通常,我們是既不檢測sin的參數,也不檢測sin的返回值。如果參數不是number,往往是我們代碼自身出問題了。這種情況下,停止執行並報錯是最簡單也是最實用的方式。
相反的,io.open這個函數,就不存在簡單的在調用open之前就檢測出異常的方法。開啟失敗可能是因為檔案不存在,或許可權不夠。通過返回錯誤碼,你可以採用適當的方式來處理,比如讓使用者輸入另一個檔案名稱。
lua的編譯,執行和調試