錯誤處理非常關鍵,因為實際操作通常需要使用複雜的操作,包括檔操作,資料庫事務和Web服務調用。
在任何編程中,總是需要錯誤處理。 錯誤可以是兩種類型,它們包括 -
- 語法錯誤
- 運行時錯誤
1. 語法錯誤
由於不正確地使用各種程式組件(如運算符和運算式),從而發生語法錯誤。 語法錯誤的一個簡單示例如下所示-
a == 2
使用單個“單等於號”和“雙等於號”之間存在差異。 使用不當可能導致錯誤。 一個“等於”指的是賦值,而兩個“等於”指的是比較。
語法錯誤的另一個示例如下所示 -
for a= 1,10
print(a)
end
當運行上述程式時,將獲得以下輸出 -
lua: test2.lua:2: 'do' expected near 'print'
語法錯誤比運行時錯誤更容易處理,因為Lua解釋器比運行時錯誤更清楚地定位錯誤。 從上面的錯誤中,可以很容易地知道根據Lua結構在print
語句之前添加do
語句。
2. 運行時錯誤
如果出現運行時錯誤,程式將成功執行,但由於輸入錯誤或錯誤處理的函數,可能會導致運行時錯誤。 顯示運行時錯誤的簡單示例如下所示。
function add(a,b)
return a+b
end
add(10)
當構建上面程式時,它將成功構建並運行。 運行後,顯示運行時錯誤。
lua: test2.lua:2: attempt to perform arithmetic on local 'b' (a nil value)
stack traceback:
test2.lua:2: in function 'add'
test2.lua:5: in main chunk
[C]: ?
這是由於未傳遞兩個參數變數而發生的運行時錯誤。 b
參數是預期的,但是因為它未傳入,默認使用的是nil
從而產生錯誤。
斷言和錯誤功能
要處理錯誤,經常使用兩個函數是 - assert
和error
。 一個簡單的例子如下所示。
local function add(a,b)
assert(type(a) == "number", "a is not a number")
assert(type(b) == "number", "b is not a number")
return a+b
end
add(10)
當構建上面程式時,它將成功構建並運行。 運行後,顯示運行時錯誤。
lua: test2.lua:3: b is not a number
stack traceback:
[C]: in function 'assert'
test2.lua:3: in function 'add'
test2.lua:6: in main chunk
[C]: ?
error(message [,level])
終止最後一個調用的受保護函數,並將消息作為錯誤消息返回。 此函數錯誤永遠不會返回。 通常,錯誤會在消息開頭添加有關錯誤位置的一些資訊。 level
參數指定如何獲取錯誤位置。 對於級別1
(默認值),錯誤位置是調用錯誤函數的位置。 級別2
將錯誤指向調用調用錯誤的函數的位置等等。 傳遞0
級可避免向消息添加錯誤位置資訊。
pcall和xpcall
在Lua編程中,為了避免拋出這些錯誤和處理錯誤,需要使用pcall
或xpcall
函數。
pcall(f,arg1,...)
函數在保護模式下調用所請求的函數。 如果函數f
中發生某些錯誤,則不會拋出錯誤。 它只返回錯誤狀態。 使用pcall
的一個簡單示例如下所示。
function myfunction ()
n = n/nil
end
if pcall(myfunction) then
print("Success")
else
print("Failure")
end
當構建上面程式時,它將成功構建並運行。 運行後,顯示運行時錯誤。
Failure
xpcall(f,err)
函數調用所請求的函數,並設置錯誤處理程式。 f
內的任何錯誤都不會傳播; 而xpcall
只捕獲錯誤,使用原始錯誤對象調用err
函數,並返回狀態代碼。
xpcall
函數的一個簡單示例如下所示 -
function myfunction ()
n = n/nil
end
function myerrorhandler( err )
print( "ERROR:", err )
end
status = xpcall( myfunction, myerrorhandler )
print( status)
當運行上面的程式時,將得到以下輸出。
ERROR: test2.lua:2: attempt to perform arithmetic on global 'n' (a nil value)
false
作為程式員,最重要的是確保在編寫的程式中處理正確的錯誤處理。 使用錯誤處理可以確保處理超出邊界條件的意外條件而不會干擾程式的用戶。