全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-19 10 分钟 ✍️ juanwangdev

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
  • 可根据异常类型条件性抑制
  • 适用于日志记录、错误处理、资源清理
  • 抑制异常需谨慎,可能隐藏重要错误

📝 发现内容有误?点击此处直接编辑

← 上一篇 Python __enter__ 与 __exit__ 方法
下一篇 → Python contextlib 模块
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库