如果需要在Lua中處理錯誤,必須使用函數pcall(protected call)來包裝需要執行的代碼。
pcall接收一個函數和要傳遞個后者的參數,并執行,執行結果:有錯誤、無錯誤;返回值true或者或false, errorinfo
復制代碼 代碼如下:
if pcall(function_name, ….) then
-- no error
else
-- some error
end
簡單示例
復制代碼 代碼如下:
> =pcall(function(i) print(i) end, 33)
33
true
> =pcall(function(i) print(i) error('error..') end, 33)
33
false stdin:1: error..
這里注意對返回值的邏輯判斷
復制代碼 代碼如下:
> function f() return false,2 end
> if f() then print '1' else print '0' end
0
pcall以一種"保護模式"來調用第一個參數,因此pcall可以捕獲函數執行中的任何錯誤。
通常在錯誤發生時,希望落得更多的調試信息,而不只是發生錯誤的位置。但pcall返回時,它已經銷毀了調用桟的部分內容。Lua提供了xpcall函數,xpcall接收第二個參數——一個錯誤處理函數,當錯誤發生時,Lua會在調用桟展看(unwind)前調用錯誤處理函數,于是就可以在這個函數中使用debug庫來獲取關于錯誤的額外信息了。
debug庫提供了兩個通用的錯誤處理函數:
debug.debug:提供一個Lua提示符,讓用戶來價差錯誤的原因
debug.traceback:根據調用桟來構建一個擴展的錯誤消息
復制代碼 代碼如下:
>=xpcall(function(i) print(i) error('error..') end, function() print(debug.traceback()) end, 33)
33
stack traceback:
stdin:1: in function <stdin:1>
[C]: in function 'error'
stdin:1: in function <stdin:1>
[C]: in function 'xpcall'
stdin:1: in main chunk
[C]: in ?
false nil