python 追蹤except信息方式
看下面這個(gè)函數(shù)
def test(): sum = 3/0 if __name__ == '__main__': test()
除0肯定是不對(duì)的,會(huì)引發(fā)一個(gè)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中運(yùn)行時(shí)出現(xiàn)的,實(shí)際在線上運(yùn)行腳本時(shí),一般會(huì)用nohup 方式啟動(dòng),輸出內(nèi)容會(huì)寫入到nohup.out文件中,但這個(gè)文件里的內(nèi)容可能非常多,很雜亂,不利于異常的排查。
python 提供了traceback ,可以完美的輸出except發(fā)生時(shí)的信息,就和上面的內(nèi)容一樣,而且可以輸入到指定的文件之中,所以,不妨寫一個(gè)裝飾器,修飾那些需要監(jiān)督的函數(shù),當(dāng)他們發(fā)生異常時(shí),記錄下有關(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)異常的信息會(huì)輸入到1.txt文件中,這個(gè)文件中只包含異常的信息,方便查看。
補(bǔ)充知識(shí):Python 的 except 怪癖
讓我來展示一下我最喜歡的 Python 怪癖。你希望這段 Python 代碼做什么?
如果你是從另一種編程語言過來學(xué)習(xí) Python 的,你可能希望except子句引入嵌套范圍,因此在子句中賦值給 e 不會(huì)影響外部作用域中已有的 e 變量。然而,在 Python 中,控制結(jié)構(gòu)通常不引入嵌套作用域(列表推導(dǎo)是一個(gè)例外),所以如果你有更多的 Python 經(jīng)驗(yàn),你可能會(huì)期望它打印一個(gè)ZeroDivisionError實(shí)例。
實(shí)際上,在標(biāo)準(zhǔn) CPython 實(shí)現(xiàn)中,它什么也不打??;同時(shí),最后一行將引發(fā)一個(gè)NameError。這是一個(gè) bug 嗎?事實(shí)上,這是故意的。如果查看 except 子句生成的字節(jié)碼,可以看到:
當(dāng)控制流退出except塊時(shí),Python 將從作用域中刪除該名稱。為什么?因?yàn)楫惓3钟袑?duì)當(dāng)前棧幀的引用,該棧幀包含作用域內(nèi)的所有內(nèi)容。由于Python主要是通過引用計(jì)數(shù)來管理內(nèi)存主體的,這意味著當(dāng)前作用域內(nèi)的任何內(nèi)容都不會(huì)被釋放,直到下一輪垃圾收集運(yùn)行 (如果有的話)。目前的行為是內(nèi)存使用、易于實(shí)現(xiàn)和語言整潔之間的折衷。它有點(diǎn)缺點(diǎn),但我認(rèn)為它體現(xiàn)了我喜歡Python的一點(diǎn):不讓純粹性妨礙實(shí)用性。
但這只解釋了DELETE_NAME指令。為什么 CPython 把e設(shè)為None,即便隨后立即就刪除了這個(gè)變量?好吧,設(shè)想你和 CPython 團(tuán)隊(duì)有相同的想法,并且決定在 except 塊的末尾清理異常引用:
在except塊的末尾,CPython 將嘗試刪除你已經(jīng)刪除的名字e!為了解決這個(gè)問題,CPython 在刪除e之前賦值e = None,以確保e存在。
以上這篇python 追蹤except信息方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 使用python自動(dòng)追蹤你的快遞(物流推送郵箱)
- Python函數(shù)調(diào)用追蹤實(shí)現(xiàn)代碼
- 如何用OpenCV -python3實(shí)現(xiàn)視頻物體追蹤
- Python+OpenCV實(shí)現(xiàn)實(shí)時(shí)眼動(dòng)追蹤的示例代碼
- 淺析Python+OpenCV使用攝像頭追蹤人臉面部血液變化實(shí)現(xiàn)脈搏評(píng)估
- OpenCV3.0+Python3.6實(shí)現(xiàn)特定顏色的物體追蹤
- python+opencv實(shí)現(xiàn)動(dòng)態(tài)物體追蹤
- Python實(shí)現(xiàn)簡單的"導(dǎo)彈" 自動(dòng)追蹤原理解析
相關(guān)文章
Jupyter Notebook切換conda虛擬環(huán)境的實(shí)現(xiàn)步驟
本文主要介紹了Jupyter Notebook切換conda虛擬環(huán)境的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07python使用IP歸屬地查詢API追蹤網(wǎng)絡(luò)活動(dòng)
這篇文章主要為大家介紹了python使用IP歸屬地查詢API追蹤網(wǎng)絡(luò)活動(dòng)實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09使用Python的Tornado框架實(shí)現(xiàn)一個(gè)簡單的WebQQ機(jī)器人
這篇文章主要介紹了使用Python的Tornado框架實(shí)現(xiàn)一個(gè)簡單的WebQQ機(jī)器人,Tornado的異步特性可以提高I/O性能,需要的朋友可以參考下2015-04-04