【问题标题】:What happens to exceptions raised in a with statement expression?在 with 语句表达式中引发的异常会发生什么?
【发布时间】:2015-06-18 07:49:00
【问题描述】:

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

with 语句 = with + 表达式 + as + 目标 + : + 西装

  1. 表达式被执行并返回一个上下文管理器
  2. 上下文管理器的__enter__返回一个值给目标
  3. 套件被执行。
  4. 上下文管理器的__exit__方法被调用

我知道在step2和step3中可以处理异常,我的问题是,如果在step1执行expression时抛出异常,我可以得到一个上下文管理器吗?

如果不是,这是否意味着 with 语句只是确保 suit 被正确执行和关闭?

with open("file") as f,如果文件不存在会怎样?

【问题讨论】:

  • 你已经想通了;如果 expression 引发异常,则不能有上下文管理器,所以不,with 语句无法处理。

标签: python with-statement contextmanager


【解决方案1】:

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 块中。

【讨论】:

    猜你喜欢
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    相关资源
    最近更新 更多