我对Python的with
语句的理解如下:
with
声明= with
+ 表达 + as
+ 目标 + :
+ 诉讼
__enter__
将值返回 target __exit__
方法我知道在步骤2和步骤3中可以处理异常,我的问题是如果在执行表达式的步骤1期间抛出异常,我可以获得上下文管理器吗?
如果不是这意味着with
语句只是确保诉讼被执行并正确关闭?
与with open("file") as f
一样,如果文件不存在会发生什么?
答案 0 :(得分:7)
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
块中。