为什么@ contextmanager的__exit__句柄在异常中传递?

时间:2015-11-05 04:27:32

标签: python exception contextmanager

在查看python 3.5中的新内容时,我找到了PEP 0479。在其基本原理中,它使用@ contextlib.contextmanager提供了一个示例。我查看了这个装饰器的源代码,发现它的退出方法中传递的异常被抛出了它的生成器:

self.gen.throw(type, value, traceback)

我想知道为什么应该在这个内部生成器中传递with块中引发的异常。我认为正确的方法是关闭生成器并让异常传播。

1 个答案:

答案 0 :(得分:1)

如果@contextmanager以你建议的方式工作,那么使用@contextmanager编写的上下文管理器(有选择地)抑制异常是不合理的。由于@contextmanager是一种通用工具,因此这种任意限制不如允许客户端代码按照自己喜欢的方式执行。

现在,您可能认为上下文管理者不应该首先抑制异常,但明确允许这样做even used by the standard library,因此现在就禁止使用它为时已晚。