抑制异常,但在异常之后继续,而不是在抑制之后继续

  • 本文关键字:之后 继续 异常 python exception
  • 更新时间 :
  • 英文 :


假设以下最小示例:

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(引发了一个不应该引发的异常。与上面的最小示例相关,这意味着我不能编辑函数中的代码,我只能将代码放在它的调用周围。我可以在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,以有条件地跳过Exception。

如果希望避免复制库源代码,可以使用inspect.getsource(stf.that_method)从活动对象中检索它,然后使用所需的替换和exec("global that_methodn" + adapted_source_code)。请注意,缩进更改和忘记导入可能只标志着基于检查的解决方法可能出现的许多问题的开始。

显然,这些都不如修补库那么漂亮,但我想你现在有理由不这么做。

最新更新