使用@contextmanager创建一个上下文管理器以在异常情况下正常工作

时间:2018-07-26 19:02:53

标签: python python-3.x error-handling contextmanager

我有以下代码

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来调用该函数。

因此,我不确定在上下文环境中发生错误的情况下如何退出上下文管理器。

1 个答案:

答案 0 :(得分:4)

您最终需要尝试:

@contextmanager
def simple_context_manager():
    print("starting context manager")
    try:
        yield
    finally:
        print("finished context manager")

如果异常从with语句中传播出去,则@contextmanager装饰器将throw将该异常进入yield点处的装饰生成器中。 finally允许我们执行清除块,而不管是否发生异常,因此我们使用它。

相关问题