1. 程式人生 > >Lua中的異常處理pcall、xpcall、debug使用例項

Lua中的異常處理pcall、xpcall、debug使用例項

如果需要在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