在with语句表达式中引发的异常会发生什么?

时间:2015-06-18 07:49:00

标签: python with-statement contextmanager

我对Python的with语句的理解如下:

with声明= with + 表达 + as + 目标 + : + 诉讼

    执行
  1. 表达式并返回上下文管理器
  2. 上下文管理器__enter__将值返回 target
  3. 执行套件
  4. 调用上下文管理器的__exit__方法
  5. 我知道在步骤2和步骤3中可以处理异常,我的问题是如果在执行表达式的步骤1期间抛出异常,我可以获得上下文管理器吗?

    如果不是这意味着with语句只是确保诉讼被执行并正确关闭?

    with open("file") as f一样,如果文件不存在会发生什么?

1 个答案:

答案 0 :(得分:7)

with语句仅管理第3步中的例外情况。如果在步骤1(执行表达式)或步骤2(执行上下文管理器__enter__方法)中引发异常,则没有(有效且有效)上下文经理将异常交给。

因此,如果该文件不存在,则在步骤1中引发异常,并且上下文管理器无法处理该异常,因为从未创建该上下文管理器。

如果这是一个问题,您可以随时单独执行表达式部分:

try:
    context_manager = expression
except SomeSpecificException:
    # do something about the exception
else:
    with context_manager as target:
        # execute the suite

如果在__enter__(步骤2)中引发了异常,则尚未输入上下文,因此不会调用__exit__。在该步骤处理异常的唯一选择是将整个with语句放在try...except块中。