with 语句表达式中引发的异常会怎样?
What happens to exceptions raised in a with statement expression?
我对Python的with
说法的理解如下:
with
语句=with
+表达式+as
+目标+:
+ 套装
- 表达式被执行并且returns一个上下文管理器
- 上下文管理器的
__enter__
returns 目标 的值
- 执行套件。
- 上下文管理器的
__exit__
方法被调用
我知道异常可以在step2和step3中处理,我的问题是如果在执行expression时在step1中抛出异常,我可以获取上下文管理器吗?
如果不是,那是否意味着 with
语句只是确保 suit 被执行并正确关闭?
如with open("file") as f
,如果文件不存在会怎样?
with
语句仅管理 步骤 3 中的异常。如果在第 1 步(执行 expression)或第 2 步(执行上下文管理器 __enter__
方法)中出现异常,您 没有 (有效且有效)上下文管理器 将异常交给。
因此,如果该文件不存在,则会在步骤 1 中引发异常并且无法由上下文管理器处理,因为从未创建该上下文管理器。
如果这是个问题,您总是可以单独执行 expression 部分:
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
块中。
我对Python的with
说法的理解如下:
with
语句=with
+表达式+as
+目标+:
+ 套装
- 表达式被执行并且returns一个上下文管理器
- 上下文管理器的
__enter__
returns 目标 的值
- 执行套件。
- 上下文管理器的
__exit__
方法被调用
我知道异常可以在step2和step3中处理,我的问题是如果在执行expression时在step1中抛出异常,我可以获取上下文管理器吗?
如果不是,那是否意味着 with
语句只是确保 suit 被执行并正确关闭?
如with open("file") as f
,如果文件不存在会怎样?
with
语句仅管理 步骤 3 中的异常。如果在第 1 步(执行 expression)或第 2 步(执行上下文管理器 __enter__
方法)中出现异常,您 没有 (有效且有效)上下文管理器 将异常交给。
因此,如果该文件不存在,则会在步骤 1 中引发异常并且无法由上下文管理器处理,因为从未创建该上下文管理器。
如果这是个问题,您总是可以单独执行 expression 部分:
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
块中。