簡體   English   中英

處理在except子句中發生的Python異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM