我正在为一个项目进行多个上下文管理器。它即将发布,我遇到了一些我开始感到恐慌的事情。
我的印象是,您不应提高作为参数传递给上下文管理器类的__exit__方法的异常。但是,我正在执行一些测试,似乎上下文管理器正在抑制内部抛出的异常。当我将__exit__方法更改为以下形式时:
def __exit__(self, type_, value, trace):
if trace is not None:
print('ERROR IN TRACEBACK: ' + str(value))
# PYTHON 2.7 RAISE SYNTAX:
raise type_, value, trace
错误似乎正确通过。
我的问题是:如果type_,value和trace不为None,在__exit__方法中处理异常的正确方法是什么?提出这样的例外情况不好吗?这是我应该怎么做吗?
我遇到的错误可能是由其他原因引起的。通常,我会仔细检查所有内容,但是目前我的时间似乎非常有限。我希望有人可以解释此功能的正确实现,
最终:我可以安全地在我的上下文管理器__exit__方法中保留引发type_,value,trace吗?
该__exit__
方法的返回值应指示是否应该重新引发传递给它的异常(根据docs):
contextmanager.__exit__(exc_type, exc_val, exc_tb)
退出运行时上下文,并返回一个布尔值标志,指示是否应禁止发生的任何异常。如果在执行with语句的主体时发生异常,则参数包含异常类型,值和回溯信息。否则,所有三个参数均为无。
因此,只要您的__exit__
方法返回的是False
-y,就应该重新引发异常,而无需您显式执行任何操作。
此外,文档明确声明不要自己重新引发异常:
传入的异常永远都不应显式地引发-相反,此方法应返回一个false值,以指示该方法已成功完成并且不想抑制所引发的异常。这使上下文管理代码(例如contextlib.nested)可以轻松检测
__exit__()
方法是否真正失败。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句