[英]Handling a Python exception that occurs within an except clause
我在Python的except
子句中有一些代碼打算執行某些日志記錄,但是日志記錄代碼本身可能會導致異常。 就我而言,我只想忽略可能發生的第二個異常,並引發原始異常。 這是一個非常簡化的示例:
try:
a = this_variable_doesnt_exist
except:
try:
1/0
except:
pass
raise
運行上面的代碼,希望得到:
NameError: name 'this_variable_doesnt_exist' is not defined
但是相反,在Python 2.x中,我得到了:
ZeroDivisionError: integer division or modulo by zero
我發現在Python 3.x中,它可以實現我想要的功能。
我在Python 2.x文檔中找不到對此的評論(除非我錯過了)。 我可以在2.x中實現嗎?
我相信您所看到的是異常鏈接的結果,這是Python 3中的一項更改 。
從PEP的動機部分中:
在處理一個異常(異常
A
)的過程中,可能會發生另一異常(異常B
)。 在當今的Python(2.4版)中,如果發生這種情況,則異常B
向外傳播,而異常A
丟失。 為了調試問題,了解兩個異常很有用。__context__
屬性自動保留此信息。
然后,PEP繼續詳細描述新的異常鏈(在Py3k中實現),這是一個有趣的閱讀。 我今天學了些新東西。
與抽象:
def log_it():
try:
1 / 0
except:
pass
try:
this = that
except:
log_it()
raise
是否滿足您在Python 2.5中的要求
另一種方法是將異常存儲在變量中,然后顯式重新引發它:
try:
this = that
except NameError, e: # or NameError as e for Python 2.6
try:
1 / 0
except:
pass
raise e
請注意,你可能不應該僅僅用裸except
捕捉可能出現的一切-它通常是最好的抓住你期待的情況下,會發生劇烈和嚴重異常(就像是內存不足)的特定的例外發生。
在我的CausedException類中,我照顧了Python 2.x(以及Python 3,如果要傳遞原因樹而不是簡單的原因鏈的話)。 也許可以幫到您。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.