获取使用@contextmanager 创建的上下文管理器以在异常情况下正常工作
Getting a context manager created with @contextmanager to work properly with exceptions
我有以下代码
from contextlib import contextmanager
@contextmanager
def simple_context_manager():
print("starting context manager")
yield
print("finished context manager")
try:
with simple_context_manager():
raise RuntimeError
except RuntimeError:
print("Caught the error")
print("Moving on")
现在打印出来
starting context manager
Caught the error
Moving on
这告诉我上下文管理器没有关闭。
我怎样才能让它关闭并打印 "finished context manager" 行?
因为我使用了装饰器,所以我没有我认为应该根据 .
调用的专用 __exit__
函数
所以我不确定如何让我的上下文管理器在其上下文内部发生错误的情况下退出。
你终于需要试一试了:
@contextmanager
def simple_context_manager():
print("starting context manager")
try:
yield
finally:
print("finished context manager")
如果异常从 with
语句传播出去,@contextmanager
装饰器将 throw 异常在 yield
点进入装饰生成器。 finally
无论是否发生异常,我们都可以执行清理块,因此我们使用它。
我有以下代码
from contextlib import contextmanager
@contextmanager
def simple_context_manager():
print("starting context manager")
yield
print("finished context manager")
try:
with simple_context_manager():
raise RuntimeError
except RuntimeError:
print("Caught the error")
print("Moving on")
现在打印出来
starting context manager
Caught the error
Moving on
这告诉我上下文管理器没有关闭。 我怎样才能让它关闭并打印 "finished context manager" 行?
因为我使用了装饰器,所以我没有我认为应该根据
__exit__
函数
所以我不确定如何让我的上下文管理器在其上下文内部发生错误的情况下退出。
你终于需要试一试了:
@contextmanager
def simple_context_manager():
print("starting context manager")
try:
yield
finally:
print("finished context manager")
如果异常从 with
语句传播出去,@contextmanager
装饰器将 throw 异常在 yield
点进入装饰生成器。 finally
无论是否发生异常,我们都可以执行清理块,因此我们使用它。