python - 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!
这可能吗?
解决方案
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 保留原样
推荐阅读
- dart - 如何修复类型“未来”
' 不是 'String' Flutter 类型的子类型 - java - 使用 javax.imageio 读取 jpeg 或 gif 元数据
- html - 输入字段的宽度仅适用于 px
- c# - 从 SelectedItem 绑定 ItemsSource
- php - crud 编辑按钮模态变量未定义
- java - 如何使对象跟随我的房子光标?
- c# - 什么样的正则表达式可以允许特殊字符但拒绝只使用特殊字符的字符串?
- immutable.js - 如何在不可变 Map 上执行范围查询?
- c# - 如何在 Winforms 应用程序中使用证书对用户进行身份验证?
- java - 在 Spring Boot/Netty 中更改错误日志记录