首页 > 解决方案 > Python 上下文管理器:是否可以修改 __exit__ 中的错误对象?

问题描述

这是一个上下文管理器:

class Timer:
    def __init__(self):
        self.elapsed = 0

    def __enter__(self):
        self.start = perf_counter()
        return self

    def __exit__(self, exc_type, exc_value, exc_traceback):
        self.stop = perf_counter()
        self.elapsed = self.stop - self.start
        if exc_type:
            # modify error object
        return False

我想为在这个上下文管理器中引发的所有错误消息添加一个前缀。

with Timer() as t:
    raise ValueError("error occurred!")

这将打印Within Timer: error occurred!

这可能吗?

标签: python

解决方案


class Timer:
    def __init__(self):
        self.elapsed = 0

    def __enter__(self):
        self.start = 5
        return self

    def __exit__(self, exc_type, exc_value, exc_traceback):
        self.stop = 5
        self.elapsed = self.stop - self.start
        if exc_value and exc_value.args:
            msg = exc_value.args[0]
            new_msg = "In Timer: " + msg
            exc_value.args = (new_msg, *exc_value.args[1:])
        return False

with Timer() as t:
    raise ValueError('hello world')

Traceback (most recent call last):
  File "...", line 19, in <module>
    raise ValueError('hello world')
ValueError: In Timer: hello world

异常的第一个 arg 是消息,因此您只需修改它,然后将其余 args 保留原样


推荐阅读