搞清楚 Python traceback

. Python中的異常棧跟蹤

之前在做Java的時候,異常對象默認就包含stacktrace相關的信息,通過異常對象的相關方法printStackTrace()和getStackTrace()等方法就可以取到異常棧信息,能打印到log輔助調(diào)試或者做一些別的事情。但是到了Python,在2.x中,異常對象可以是任何對象,經(jīng)??吹胶芏啻a是直接raise一個字符串出來,因此就不能像Java那樣方便的獲取異常棧了,因為異常對象和異常棧是分開的。而多數(shù)Python語言的書籍上重點在于描述Python中如何構(gòu)造異常對象和raise try except finally這些的使用,對調(diào)試程序起關鍵作用的stacktrace往往基本上不怎么涉及。

python中用于處理異常棧的模塊是traceback模塊,它提供了print_exception、format_exception等輸出異常棧等常用的工具函數(shù)。

def func(a, b):

returna / b

if__name__ =='__main__':

importsys

importtraceback

try:

func(1,0)

exceptExceptionase:

print"print exc"

traceback.print_exc(file=sys.stdout)

輸出結(jié)果:

print exc

Traceback (most recentcalllast):

File"./teststacktrace.py", line7,in

func(1,0)

File"./teststacktrace.py", line2,infunc

return? a / b

其實traceback.print_exc()函數(shù)只是traceback.print_exception()函數(shù)的一個簡寫形式,而它們獲取異常相關的數(shù)據(jù)都是通過sys.exc_info()函數(shù)得到的。

def func(a, b):

returna / b

if__name__ =='__main__':

importsys

importtraceback

try:

func(1,0)

exceptExceptionase:

print"print_exception()"

exc_type, exc_value, exc_tb = sys.exc_info()

print'the exc type is:', exc_type

print'the exc value is:', exc_value

print'the exc tb is:', exc_tb

traceback.print_exception(exc_type, exc_value, exc_tb)

輸出結(jié)果:

print_exception()

the exc typeis:

the exc valueis:integerdivisionormodulobyzero

the exc tbis:

Traceback (most recentcalllast):

File"./teststacktrace.py", line7,in

func(1,0)

File"./teststacktrace.py", line2,infunc

return? a / b


sys.exc_info()返回的值是一個元組,其中第一個元素,exc_type是異常的對象類型,exc_value是異常的值,exc_tb是一個traceback對象,對象中包含出錯的行數(shù)、位置等數(shù)據(jù)。然后通過print_exception函數(shù)對這些異常數(shù)據(jù)進行整理輸出。

traceback模塊提供了extract_tb函數(shù)來更加詳細的解釋traceback對象所包含的數(shù)據(jù):

def func(a, b):

returna / b

if__name__ =='__main__':

importsys

importtraceback

try:

func(1,0)

except:

_, _, exc_tb = sys.exc_info()

forfilename, linenum, funcname, sourceintraceback.extract_tb(exc_tb):

print"%-23s:%s '%s' in %s()"% (filename, linenum, source, funcname)

輸出結(jié)果:

samchimac:tracebacktest samchi$ python ./teststacktrace.py ./teststacktrace.py? ? :7'func(1,0)'in()./teststacktrace.py? ? :2'returna / b'infunc()

2. 使用cgitb來簡化異常調(diào)試

如果平時開發(fā)喜歡基于log的方式來調(diào)試,那么可能經(jīng)常去做這樣的事情,在log里面發(fā)現(xiàn)異常之后,因為信息不足,那么會再去額外加一些debug log來把相關變量的值輸出。調(diào)試完畢之后再把這些debug log去掉。其實沒必要這么麻煩,Python庫中提供了cgitb模塊來幫助做這些事情,它能夠輸出異常上下文所有相關變量的信息,不必每次自己再去手動加debug log。

cgitb的使用簡單的不能想象:

def func(a, b):

returna / b

if__name__ =='__main__':

importcgitb

cgitb.enable(format='text')

importsys

importtraceback

func(1,0)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • IO密集型程序、深拷貝和淺拷貝、模塊導入、with 語句 1.1 GIL 學習目標 1. 能夠說出 GIL 是什...
    Cestine閱讀 1,123評論 0 0
  • 5 我躺在自己睡的下鋪發(fā)愣。兩眼出神的瞧著上鋪劣質(zhì)的木板床底,蒙著灰塵的上面參差不...
    文心妙運閱讀 202評論 0 0
  • 自從接觸到了潤啟教育,聽了劉老師的課,帶給我很大的改變,以前我對政旭強制要求的多,總想讓他按我的規(guī)劃走。他做不到了...
    yundanfengqing閱讀 105評論 0 0
  • 安歌送佳音閱讀 416評論 0 0

友情鏈接更多精彩內(nèi)容