當Lua遇到不期望的情況時就會拋出錯誤,比如:兩個非數字進行相加;調用一個非函數的變量;訪問表中不存在的值等。你也可以通過調用error函數顯示的拋出錯誤,error的參數是要拋出的錯誤信息。
assert(a,b) a是要檢查是否有錯誤的一個參數,b是a錯誤時拋出的信息。第二個參數b是可選的。
print("enter a number:") n = io.read("*number") if not n then error("invalid input") end
Lua提供了專門的內置函數assert( )來完成上述的類似功能
print("enter a number:") n = assert(io.read("*number"), "invalid input")
assert首先檢查的是第一個參數是否返回錯誤,如果不返回錯誤,則assert簡單返回,否則則以第二個參數拋出異常信息。
assert()是普通函數,他首先計算兩個參數,然后在調用函數,如:
n = io.read() assert(tonumber(n), "invalid input:" .. n .. "is not a number")
先進行tonumber(n), "invalid input:" .. n .. "is not a number"
這兩個參數的計算。
沒用assert( )時:
input = io.read("*number") print(input)
運行結果:
nil [Finished in 0.3s]
用assert( )時:
input = assert(io.read("*number")) print(input)
運行結果:
lua: D:\UserProfiles\BenLuo\Desktop\study\test.lua:44: assertion failed! stack traceback: [C]: in function 'assert' D:\UserProfiles\BenLuo\Desktop\study\test.lua:44: in main chunk [C]: ? [Finished in 0.3s with exit code 1]
Lua中,assert的作用
在看《Lua游戲開發實踐指南》時,在P34中有說明assert,但是說明特少,導致自己完全不懂所以然,因此自己研究了一下。
百度百科的解釋:
- Assert(斷言)編寫代碼時,我們總是會做出一些假設,斷言就是用於在代碼中捕捉這些假設,可以將斷言看作是異常處理的一種高級形式。斷言表示為一些布爾表達式,程序員相信在程序中的某個特定點該表達式值為真。可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言,而在部署時禁用斷言。同樣,程序投入運行后,最終用戶在遇到問題時可以重新起用斷言。斷言只有在Debug模式下才有效。
下面結合Lua的例子,來看看Assert具體有什么用:)
1.「沒有Assert的情況」
- --這里輸入一個數字
- print(string.format("Please Enter A Number:"))
- input = io.read("*number")
- print(input)
當輸入的是“?”時,結果如下
可以看到,系統沒有報錯,可以正常運行。
2.「有Assert的情況」
- --這里輸入一個數字
- print(string.format("Please Enter A Number:"))
- input1 = assert(io.read("*number"))
- print(input)
當輸入的還是“?”時,結果就完全不同了
可以看到,當有assert包圍代碼后,遇到錯誤,會拋出異常,而不會上剛剛那樣。這樣的用處十分之大,當項目大了之后,出錯可以很好地定位到是哪里出錯。