python - with 语句表达式中引发的异常会怎样?

标签 python with-statement contextmanager

我对Python的with语句的理解是这样的:

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

  1. expression 被执行并返回上下文管理器
  2. 上下文管理器的 __enter__ 返回一个值给target
  3. 执行套件
  4. 上下文管理器的__exit__方法被调用

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

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

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

最佳答案

with 语句仅管理第 3 步 中的异常。如果在步骤 1(执行 expression)或步骤 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 block 中。

关于python - with 语句表达式中引发的异常会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30909463/

相关文章:

python - 如何在上下文管理器中安全地处理异常

python - 获取使用@contextmanager 创建的上下文管理器以在异常情况下正常工作

python - 在这里可以接受抑制 `asyncio.CancelledError` 吗?

python - 从挂载的文件系统生成requirements.txt?

python - 在 "with"上下文中同时打开两个文件

javascript - 语法错误: 'with' statements are not valid in strict mode

python - 如何使 Python 字符串包含 unicode 代码点?

python - 为什么没有join()守护程序不退出

python - 如何在 python 中 "with open"文件列表并获取它们的句柄?

python - 没有 "with"关键字的 "as"语句的含义