我有以下代码
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
这告诉我上下文管理器没有关闭。 我怎样才能让它关闭并打印“完成的上下文管理器”行?
因为我正在使用装饰器,所以我没有我认为应该根据 this 调用的专用 __exit__
函数.
所以我不确定如何让我的上下文管理器在其上下文内部发生错误的情况下退出。
最佳答案
你最终需要尝试一下:
@contextmanager
def simple_context_manager():
print("starting context manager")
try:
yield
finally:
print("finished context manager")
如果异常从with
语句传播出去,@contextmanager
装饰器将throw在 yield
处进入装饰生成器的异常。 finally
让我们无论是否发生异常都执行清理 block ,因此我们使用它。
关于python - 获取使用@contextmanager 创建的上下文管理器以在异常情况下正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51545893/