首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在with语句表达式中引发的异常会发生什么?

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

Stack Overflow用户
提问于 2015-06-18 07:49:00
回答 1查看 336关注 0票数 8

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

with语句= with +表达式+ as + target + : + suit

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

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-18 07:58:47

with语句仅管理步骤3中的异常。如果在步骤1(执行表达式)或步骤2(执行上下文管理器__enter__方法)中引发异常,则不需要将异常传递给(有效和工作的)上下文管理器。

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

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

代码语言:javascript
复制
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块中。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30909463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档