天天看點

19.錯誤(error)

Lua所遇到的任何未預期條件都會引發一個錯誤。是以在發生錯誤時不能簡單的崩潰或着退出,而是結束目前程式塊并傳回應用程式。當錯誤引發時進行恰當的處理是最合适的,然而這個階段伴随着錯誤的捕獲、錯誤的處理、錯誤追溯等處理。Lua中有函數pcall、error、assert函數來操作錯誤。其中pcall用于捕獲錯誤、error抛出一個錯誤、assert是error的包裝

19.錯誤(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。

19.錯誤(error)

04.通常在錯誤發生時,希望獲得更多的調試資訊,而不隻是發生錯誤的位置。但pcall傳回時已經銷毀了調用棧的部分内容,Lua提供了xpcall來實作這個功能。

xpcall(func, handler)

Lua提供了xpcall函數接收的第二個參數是一個錯誤處理的函數,當錯誤發生時,Lua會在調用棧展看unwind前調用錯誤處理函數,于是就可以在這個函數中使用debug庫來擷取關于錯誤的額外資訊。

debug庫提供了兩個通用的錯誤處理函數:

debug.debug 提供一個Lua提示符讓使用者來處理錯誤的原因

debug.traceback 根據調用棧來建構一個擴充的錯誤消息