Ero*_*mic 4 python exception-handling contextmanager
我正在为一个正在研究的项目提供几个上下文管理器.它即将发货,我遇到了一些我开始恐慌的事情.
我的印象是你不应该再加上作为上下文管理器类的__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
Run Code Online (Sandbox Code Playgroud)
这些错误似乎正确地通过了.
我的问题是:如果type_,value和trace不是None,那么在__exit__方法中处理异常的正确方法是什么?提升(重新加注?)这样的例外是不是很糟糕?这是我应该怎么做的?
我遇到的错误可能是由其他原因造成的.通常我会仔细检查这一切,但我的时间似乎非常有限.我希望有人可以解释这个功能的正确实现
最终:我可以在上下文管理器__exit__方法中安全地保留raise type_,value,trace吗?
该__exit__方法的返回值应该表明是否传递给它应重新提出(每任何异常的文档):
contextmanager.__exit__(exc_type, exc_val, exc_tb)退出运行时上下文并返回一个布尔标志,指示是否应该抑制发生的任何异常.如果在执行with语句的主体时发生异常,则参数包含异常类型,值和回溯信息.否则,所有三个参数都是None.
因此,只要您的__exit__方法返回False-y,就应该重新引发异常而不显式执行任何操作.
此外,docs explicilty声明不要自己重新提出异常:
传入的异常永远不应该显式重新标记 - 相反,此方法应返回false值以指示方法已成功完成且不希望抑制引发的异常.这允许上下文管理代码(例如contextlib.nested)轻松检测
__exit__()方法是否实际失败.
| 归档时间: |
|
| 查看次数: |
374 次 |
| 最近记录: |