Lua所遇到的任何未預期條件都會引發一個錯誤。是以在發生錯誤時不能簡單的崩潰或着退出,而是結束目前程式塊并傳回應用程式。當錯誤引發時進行恰當的處理是最合适的,然而這個階段伴随着錯誤的捕獲、錯誤的處理、錯誤追溯等處理。Lua中有函數pcall、error、assert函數來操作錯誤。其中pcall用于捕獲錯誤、error抛出一個錯誤、assert是error的包裝
抛出錯誤
在Lua中抛出錯誤資訊的函數是error,通常包含調用堆棧資訊以及錯誤提示資訊。而assert是error的包裝,它有兩個參數可選,第一個參數 如果傳回false,那麼就引發錯誤,抛出錯誤提示資訊第二個參數。是以使用assert要比error更為簡便。
兩種方式都是可以的,而且可以自定義錯誤資訊,簡便快捷的跟蹤錯誤位置及錯誤子產品。
function add(a,b)
return a+b
end
add(10)
lua.exe: …sers/Administrator/IdeaProjects/untitled1/Error2.lua:2: attempt to perform arithmetic on local ‘b’ (a nil value)
stack traceback:
…sers/Administrator/IdeaProjects/untitled1/Error2.lua:2: in function ‘add’
…sers/Administrator/IdeaProjects/untitled1/Error2.lua:5: in main chunk
[C]: ?
02.錯誤處理
們可以使用兩個函數:assert 和 error 來處理錯誤。執行個體如下:
local function add(a,b)
assert(type(a) == "number", "a 不是一個數字")
assert(type(b) == "number", "b 不是一個數字")
return a+b
end
add(10);
--執行個體中assert首先檢查第一個參數,若沒問題,assert不做任何事情;否則,assert以第二個參數作為錯誤資訊抛出。
lua.exe: …sers/Administrator/IdeaProjects/untitled1/Error2.lua:3: b 不是一個數字
stack traceback:
[C]: in function ‘assert’
…sers/Administrator/IdeaProjects/untitled1/Error2.lua:3: in function ‘add’
…sers/Administrator/IdeaProjects/untitled1/Error2.lua:6: in main chunk
[C]: ?
01.error
error(message [, level])
- 功能:終止正在執行的函數并傳回消息的内容作為錯誤資訊,通常情況error會附加一些錯誤位置的資訊到message的頭部。
- 參數:
- level 訓示獲得錯誤的位置
- level=0 不添加錯誤位置資訊
- level=1 預設為調用error位置,形式為檔案+行号
-
level=2 指出哪個調用error的函數的函數
02.assert
assert(v [, message])
– v 檢查是否有錯誤,當為false或nil時抛出錯誤。
–message 可選 錯誤資訊,當檢查出有錯誤是抛出的資訊,預設值為assertion failed!
斷言就是用于在代碼中捕捉這些假設,可将斷言看做是異常處理的一種進階形式。斷言表示為一些布爾表達式,程式員相信在程式中某個特定點,該表達式值為真。可以在任何時候啟用和禁用斷言驗證。是以可在測試時啟動斷言,而在部署時禁用斷言。同樣,程式投入運作後,最終使用者在遇到問題是可重新啟用斷言。斷言隻有在debug模式下才有效。
03.pcall()
在Lua中處理錯誤,必須使用函數pcall(protected call)來包裝需要執行的代碼。pcall接收一個函數和要傳遞給後者的參數并執行。
pcall以一種“保護模式”來調用第一個參數,可同時捕獲函數執行中的任何錯誤和異常。若被執行函數一切正常,pcall傳回true以及被執行函數函數的傳回值,否則傳回nil和錯誤資訊。也就是說成功僅僅有一個傳回值,而失敗則有兩個傳回值。
call接收一個函數和要傳遞給後者的參數,并執行,執行結果:有錯誤、無錯誤;傳回值true或者或false, errorinfo。
04.通常在錯誤發生時,希望獲得更多的調試資訊,而不隻是發生錯誤的位置。但pcall傳回時已經銷毀了調用棧的部分内容,Lua提供了xpcall來實作這個功能。
xpcall(func, handler)
Lua提供了xpcall函數接收的第二個參數是一個錯誤處理的函數,當錯誤發生時,Lua會在調用棧展看unwind前調用錯誤處理函數,于是就可以在這個函數中使用debug庫來擷取關于錯誤的額外資訊。
debug庫提供了兩個通用的錯誤處理函數:
debug.debug 提供一個Lua提示符讓使用者來處理錯誤的原因
debug.traceback 根據調用棧來建構一個擴充的錯誤消息