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

What happens to exceptions raised in a with statement expression?

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

with语句=with表达式+as目标+:花色

  • 执行表达式并返回上下文管理器
  • Context Manager的__enter__返回目标值
  • 执行套件。
  • 调用上下文管理器的__exit__方法
  • 我知道异常可以在步骤2和步骤3中处理,我的问题是,如果在执行表达式时在步骤1期间引发异常,我能得到一个上下文管理器吗?

    如果不是,这是否意味着with声明只是确保诉讼被正确地执行和结束?

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


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

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

    如果这是一个问题,则始终可以单独执行表达式部分:

    1
    2
    3
    4
    5
    6
    7
    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块中。