Lua錯誤處理之error、assert、pcall和xpcall

Lua錯誤處理

error

error (message [, level])

中止上一次保護函數調用,將錯誤對象 message 返回。 函數 error 永遠不會返回。
當 message 是一個字符串時,通常 error 會把一些有關出錯位置的信息附加在消息的前頭。 level 參數指明瞭怎樣獲得出錯位置。 對於 level 1 (默認值),出錯位置指 error 函數調用的位置。 Level 2 將出錯位置指向調用 error的函數的函數;以此類推。 傳入 level 0 可以避免在消息前添加出錯位置信息。

在Lua中使用error函數拋出錯誤信息,通常包含調用堆棧信息以及錯誤提示信息!
第一個參數message爲自定義的錯誤提示信息。
第二個參數爲可選的出錯位置信息,默認爲1,即爲調用error函數的位置;2即爲調用error函數的函數的位置;0則不打印出錯位置信息!

function testError()
    error("error test1")
    -- error("error test2", 1)
    -- error("error test3", 0)
    -- error("error test4", 2)
end

testError()
--[[
lua: C:\Users\user\Desktop\transition\csdn\test.lua:2: error test1
stack traceback:
    [C]: in function 'error'
    C:\Users\user\Desktop\transition\csdn\test.lua:2: in function 'testError'
    C:\Users\user\Desktop\transition\csdn\test.lua:8: in main chunk
    [C]: ?
]]

assert

assert (v [, message])

如果其參數 v 的值爲假(nil 或 false), 它就調用 error; 否則,返回所有的參數。 在錯誤情況時, message 指那個錯誤對象; 如果不提供這個參數,參數默認爲 “assertion failed!” 。

assert是error的包裝,將判斷之類的操作包裝了進去!所以使用assert比之使用error更爲方便!
第一個參數爲nil或判斷的結果爲false的時候拋出錯誤,中止運行,調用error函數;否則繼續執行!
第二個參數爲可選的錯誤提示信息,如果提供這個參數,調用error函數的時候則打印出message;否則使用默認的"assertion failed!"。

function testAssert()
    local a, b = "hello", "world"
    assert(a == b, "a,b is not equal !")
    print("next operate")
end

testAssert()
--[[
lua: C:\Users\user\Desktop\transition\csdn\test.lua:3: a,b is not equal !
stack traceback:
    [C]: in function 'assert'
    C:\Users\user\Desktop\transition\csdn\test.lua:3: in function 'testAssert'
    C:\Users\user\Desktop\transition\csdn\test.lua:7: in main chunk
    [C]: ?
]]

pcall

pcall (f [, arg1, ···])

傳入參數,以 保護模式 調用函數 f 。 這意味着 f 中的任何錯誤不會拋出; 取而代之的是,pcall 會將錯誤捕獲到,並返回一個狀態碼。 第一個返回值是狀態碼(一個布爾量), 當沒有錯誤時,其爲真。 此時,pcall 同樣會在狀態碼後返回所有調用的結果。 在有錯誤時,pcall 返回 false 加錯誤消息。

pcall會捕捉錯誤,但不會拋出,所以程序的運行不會被中止!
第一個參數爲目標函數,如果目標函數執行發生錯誤,pcall函數返回false和錯誤信息;否則pcall函數返回true和目標函數所有的調用結果!
後面的參數爲目標函數的參數列表,可選!

function testPcall(arg1, arg2)
    print(arg1, arg2)
    error("pcall test")
    -- return "pcall test"
end

local ret, msg = pcall(testPcall, "hello", "fightsyj")
print(ret, msg)

print("next operate")
--[[
hello   fightsyj
false   C:\Users\user\Desktop\transition\csdn\test.lua:3: pcall test
next operate
]]

xpcall

xpcall (f, msgh [, arg1, ···])

這個函數和 pcall 類似。 不過它可以額外設置一個消息處理器 msgh。

xpcall在pcall的基礎之上還可以加一個錯誤處理函數!
第一個參數以及後面的參數列表和pcall一樣!
第二個參數爲錯誤處理函數,可以在這個函數中做打印堆棧信息等操作!

function testXpcall()
    error("xpcall test")
    -- return "pcall test"
end

-- 錯誤處理函數
function dealFunc()
    -- print(debug.traceback())
    print("xpcall dealFunc")
end

local ret, msg = xpcall(testXpcall, dealFunc)
print(ret, msg)

print("next operate")
--[[
xpcall dealFunc
false   nil
next operate
]]

參考:
Lua 5.3 參考手冊
Lua 學習筆記(八)錯誤(error)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章