簡體   English   中英

抑制異常但在異常后繼續,而不是在抑制后

[英]Suppress an Exception but Continue after the Exception, not after the Suppression

假設以下最小示例:

def external_code():
    for i in range(10):
        if i == 7:
            raise ValueError("I don't like sevens.")
        print(i)

external_code()

通過處理來抑制異常時

try:
    external_code()
except ValueError:
    pass

或通過contextlib.suppress()抑制

from contextlib import suppress

with suppress(ValueError):
    external_code()

不會引發異常,但會阻止執行之后的代碼,而是在except塊中或在抑制之后繼續執行。

是否可以抑制異常,然后繼續使用外部代碼,就好像異常甚至不存在一樣? 在上面的代碼示例中,這將導致打印所有 10 個數字,而不是僅打印 0 到 6。

我需要這個,因為外部庫(TensorFlow)引發了它不應該引發的異常。 與上面的最小示例相關,這意味着我無法編輯 function 中的代碼,我只能在其調用周圍放置代碼。 我可以注釋掉 TensorFlow 中的異常,但是更新 TF 很乏味,並且還會導致異常在其他實際合適的情況下不會發生。

作為一種解決方法,您可以隨時重新定義該方法:

class SomeTensorFlowClass(object):
    def that_method(self, n=10):
        for i in range(n):
            if i == 7:
                raise ValueError()
            print(i)


stf = SomeTensorFlowClass()

def that_method(n=10):
    self = stf  # for non-static methods
    for i in range(n):
        print(i)

stf.that_method = that_method

這樣,你仍然“更新”了 TensorFlow,但是你可以在出現這種情況后直接撤消它。

如果您經常切換,您可以添加一個新標志,如seven_is_ok=False以有條件地跳過異常。

如果您想避免復制庫源代碼,您可以從 live object 中檢索它,使用inspect.getsource(stf.that_method)后跟所需的替換和exec("global that_method\n" + adapted_source_code) 請注意,縮進更改和忘記的導入可能僅標志着基於檢查的解決方法可能出現的許多問題的開始。

顯然,沒有一個比修補庫更漂亮,但我認為你現在有理由不這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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