在查看python 3.5中的新内容时,我找到了PEP 0479。在其基本原理中,它使用@ contextlib.contextmanager提供了一个示例。我查看了这个装饰器的源代码,发现它的退出方法中传递的异常被抛出了它的生成器:
self.gen.throw(type, value, traceback)
我想知道为什么应该在这个内部生成器中传递with块中引发的异常。我认为正确的方法是关闭生成器并让异常传播。
答案 0 :(得分:1)
如果@contextmanager
以你建议的方式工作,那么使用@contextmanager
编写的上下文管理器(有选择地)抑制异常是不合理的。由于@contextmanager
是一种通用工具,因此这种任意限制不如允许客户端代码按照自己喜欢的方式执行。
现在,您可能认为上下文管理者不应该首先抑制异常,但明确允许这样做even used by the standard library,因此现在就禁止使用它为时已晚。