【发布时间】:2014-11-13 10:53:03
【问题描述】:
我知道从上下文管理器的 __exit__() 方法中重新引发异常是一种不好的风格。因此,我想在实例上添加一个属性,该属性可以携带如果我让异常通过或捕获它时不可用的上下文信息。这样可以避免重新加注。
在异常上附加属性的替代方法是吞下异常,在实例上设置一些状态,该实例兼作相关上下文管理器,然后检查该状态。问题是这会导致捕获 22,不是吗?由于异常意味着正在退出 with 块内的执行。除了再次输入with块之外,没有其他方法可以重复操作,对吧?因此,一旦__exit__() 方法返回,我尝试存储上下文信息的实例就会消失。
简而言之:在 __exit__() 方法中,我如何操纵实际未决的异常(如果是,我将假定为这个问题)?
【问题讨论】:
-
谁说风格不好?上下文管理器是转换异常的绝佳方式。
-
@MartijnPieters:实际上 文档 指出这是一种不好的风格,因为它会产生嵌套上下文管理器的问题。是的,对于转换和不嵌套,很好。
-
您不应该重新引发相同的异常(只返回
None可确保保持异常状态),但您可以引发new 异常。 -
@MartijnPieters:确实如此。但例外是好的,除了我需要在调用链上携带一些信息。所以这就是为什么在我的情况下再加注是不好的风格。
标签: python python-2.x contextmanager