我有以下代码
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
告诉我上下文管理器没有关闭。 如何关闭并打印“完成的上下文管理器”行?
自从我使用装饰器以来,我没有专用的__exit__
函数,我认为应该根据this来调用该函数。
因此,我不确定在上下文环境中发生错误的情况下如何退出上下文管理器。
答案 0 :(得分:4)
您最终需要尝试:
@contextmanager
def simple_context_manager():
print("starting context manager")
try:
yield
finally:
print("finished context manager")
如果异常从with
语句中传播出去,则@contextmanager
装饰器将throw将该异常进入yield
点处的装饰生成器中。 finally
允许我们执行清除块,而不管是否发生异常,因此我们使用它。