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
]]