python - 获取使用@contextmanager 创建的上下文管理器以在异常情况下正常工作

标签 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

这告诉我上下文管理器没有关闭。 我怎样才能让它关闭并打印“完成的上下文管理器”行?

因为我正在使用装饰器,所以我没有我认为应该根据 this 调用的专用 __exit__ 函数.

所以我不确定如何让我的上下文管理器在其上下文内部发生错误的情况下退出。

最佳答案

你最终需要尝试一下:

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

如果异常从with 语句传播出去,@contextmanager 装饰器将throwyield 处进入装饰生成器的异常。 finally 让我们无论是否发生异常都执行清理 block ,因此我们使用它。

关于python - 获取使用@contextmanager 创建的上下文管理器以在异常情况下正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51545893/

相关文章:

python - 在打印功能中包含变量的问题

python 3 : How can I add decimals that are inside a string

python - 加快动画 gif kivy 的加载

python - 检查YouTube视频是否可以嵌入使用

spring - 如何使用 Spring Boot 创建 404 Controller ?

python - 创建使用 Multiprocessing 和 Multiprocessing.Queues 的 linux 守护进程

python - pandas 引发日期时间对象的值错误

Python float to string(科学记数法),特定格式

javascript - JSON.Parse 不处理非法字符

c# - 异步数据加载及后续错误处理