Python3 的異常處理,在官方文檔的 tutorial 中有說明。
這里把常用的異常處理方法都列出來,方便平時查找。
捕獲異常基類
Python3 要求我們的異常必須繼承 Exception 類。Built-in 的所有異常也都是繼承自這個類。因此,我們只需要捕獲這個類的實例,就可以捕獲所有的異常。
try: raise except Exception as err: print(err)
使用 sys.exc_info() 和 sys.last_traceback
sys.exc_info()
會返回一個3值元表,其中包含調用該命令時捕獲的異常。
這個元表的內容為 (type, value, traceback) ,其中:
- type 從獲取到的異常中得到類型名稱,它是BaseException 的子類;
- value 是捕獲到的異常實例;
- traceback 是一個 traceback 對象,下面會詳述。
sys.last_traceback
包含的內容與 sys.exc_info()
相同,但它主要用於調試,並不總是被定義。
import sys try: raise except: t,v,tb = sys.exc_info() print(t,v)
使用 traceback
trackback 模塊用來精確模仿 python3 解析器的 stack trace 行為。在程序中應該盡量使用這個模塊。
traceback.print_exc()
可以直接打印當前的異常。
import traceback try: raise except: traceback.print_exc()
traceback.print_tb()
用來打印上面提到的 trackback 對象。
import sys,traceback try: raise except: t,v,tb = sys.exc_info() traceback.print_tb(tb)
traceback.print_exception()
可以直接打印 sys.exc_info()
提供的元表。
import sys,traceback try: raise except: traceback.print_exception(*sys.exc_info())
其實,下面兩句是等價的:
traceback.print_exc()
traceback.print_exception(*sys.exc_info())
traceback 提供的參數可以將 print 的內容寫入到文件中,詳見這里:29.9. traceback — Print or retrieve a stack traceback