在Python2.7上下文管理器类中处理异常的正确方法

色情

我正在为一个项目进行多个上下文管理器。它即将发布,我遇到了一些我开始感到恐慌的事情。

我的印象是,您不应提高作为参数传递给上下文管理器类的__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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章