Python exit 异常处理
__exit__ 方法接收异常信息并决定是否抑制异常,是上下文管理器处理错误的核心。
方法签名
Python
def __exit__(self, exc_type, exc_val, exc_tb):
"
exc_type: 异常类型(类对象),无异常时为 None
exc_val: 异常实例,无异常时为 None
exc_tb: traceback 对象,无异常时为 None
"
pass
参数详解
Python
import traceback
class ExceptionLogger:
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type:
print(f"异常类型: {exc_type.__name__}")
print(f"异常信息: {exc_val}")
print(f"堆栈追踪:")
traceback.print_tb(exc_tb)
return False
with ExceptionLogger():
raise ValueError("测试异常")
输出:
Python
异常类型: ValueError
异常信息: 测试异常
堆栈追踪:
File "example.py", line X, in <module>
raise ValueError("测试异常")
异常抑制机制
Python
class SuppressValueError:
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type is ValueError:
print(f"抑制 ValueError: {exc_val}")
return True # 抑制异常
return False # 其他异常正常传播
with SuppressValueError():
raise ValueError("这个异常被抑制")
print("程序继续执行") # 正常输出
# TypeError 不被抑制
with SuppressValueError():
raise TypeError("这个异常会传播") # 正常抛出
返回值行为
| 返回值 | 效果 |
|---|---|
| False / None | 异常正常传播 |
| True | 抑制异常,继续执行 |
条件性异常处理
Python
class RetryHandler:
def __init__(self, max_retries=3):
self.max_retries = max_retries
self.retries = 0
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type and self.retries < self.max_retries:
self.retries += 1
print(f"第 {self.retries} 次重试...")
return True # 抑制异常,允许重试
return False
# 使用示例
handler = RetryHandler(max_retries=2)
while True:
with handler:
if handler.retries < 2:
raise ValueError("模拟失败")
break
记录异常并重新抛出
Python
class ExceptionTracker:
exceptions = []
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type:
self.exceptions.append({
'type': exc_type.__name__,
'value': str(exc_val),
'traceback': exc_tb
})
return False # 不抑制,继续传播
# 收集所有异常
tracker = ExceptionTracker()
try:
with tracker:
raise ValueError("第一个异常")
except ValueError:
pass
print(tracker.exceptions)
异常链处理
text
class ChainedExceptionHandler:
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type:
# 将原异常包装为新异常
raise RuntimeError("处理失败") from exc_val
return False
要点总结
__exit__三个参数提供完整异常信息- 返回 True 抑制异常,False 或 None 传播异常
- 无异常时三个参数均为 None
- 可根据异常类型条件性抑制
- 适用于日志记录、错误处理、资源清理
- 抑制异常需谨慎,可能隐藏重要错误
📝 发现内容有误?点击此处直接编辑