获取使用@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 无论是否发生异常,我们都可以执行清理块,因此我们使用它。