您好,登錄后才能下訂單哦!
這篇文章主要講解了python怎么追蹤except信息,內(nèi)容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。
看下面這個函數(shù)
def test(): sum = 3/0 if __name__ == '__main__': test()
除0肯定是不對的,會引發(fā)一個except,內(nèi)容如下:
File "E:\Src\dongsheng\TestPython\testtrace_back.py", line 23, in <module>
test()
File "E:\Src\dongsheng\TestPython\testtrace_back.py", line 19, in test
sum = 3/0
ZeroDivisionError: integer division or modulo by zero
上面的提示,是在IDE中運行時出現(xiàn)的,實際在線上運行腳本時,一般會用nohup 方式啟動,輸出內(nèi)容會寫入到nohup.out文件中,但這個文件里的內(nèi)容可能非常多,很雜亂,不利于異常的排查。
python 提供了traceback ,可以完美的輸出except發(fā)生時的信息,就和上面的內(nèi)容一樣,而且可以輸入到指定的文件之中,所以,不妨寫一個裝飾器,修飾那些需要監(jiān)督的函數(shù),當他們發(fā)生異常時,記錄下有關(guān)異常的信息。
#coding=utf-8 from functools import wraps import traceback def except_trace(filename): def decorate(func): @wraps(func) def wrapper(*args,**kwargs): try: func(*args,**kwargs) except: fp = open(filename,'w') traceback.print_exc(file=fp) fp.close() return wrapper return decorate @except_trace('1.txt') def test(): sum = 3/0 if __name__ == '__main__': test()
這一次,發(fā)生異常后,有關(guān)異常的信息會輸入到1.txt文件中,這個文件中只包含異常的信息,方便查看。
補充知識:Python 的 except 怪癖
讓我來展示一下我最喜歡的 Python 怪癖。你希望這段 Python 代碼做什么?
如果你是從另一種編程語言過來學習 Python 的,你可能希望except子句引入嵌套范圍,因此在子句中賦值給 e 不會影響外部作用域中已有的 e 變量。然而,在 Python 中,控制結(jié)構(gòu)通常不引入嵌套作用域(列表推導(dǎo)是一個例外),所以如果你有更多的 Python 經(jīng)驗,你可能會期望它打印一個ZeroDivisionError實例。
實際上,在標準 CPython 實現(xiàn)中,它什么也不打??;同時,最后一行將引發(fā)一個NameError。這是一個 bug 嗎?事實上,這是故意的。如果查看 except 子句生成的字節(jié)碼,可以看到:
當控制流退出except塊時,Python 將從作用域中刪除該名稱。為什么?因為異常持有對當前棧幀的引用,該棧幀包含作用域內(nèi)的所有內(nèi)容。由于Python主要是通過引用計數(shù)來管理內(nèi)存主體的,這意味著當前作用域內(nèi)的任何內(nèi)容都不會被釋放,直到下一輪垃圾收集運行 (如果有的話)。目前的行為是內(nèi)存使用、易于實現(xiàn)和語言整潔之間的折衷。它有點缺點,但我認為它體現(xiàn)了我喜歡Python的一點:不讓純粹性妨礙實用性。
但這只解釋了DELETE_NAME指令。為什么 CPython 把e設(shè)為None,即便隨后立即就刪除了這個變量?好吧,設(shè)想你和 CPython 團隊有相同的想法,并且決定在 except 塊的末尾清理異常引用:
在except塊的末尾,CPython 將嘗試刪除你已經(jīng)刪除的名字e!為了解決這個問題,CPython 在刪除e之前賦值e = None,以確保e存在。
看完上述內(nèi)容,是不是對python怎么追蹤except信息有進一步的了解,如果還想學習更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。