Python异常链

异常链是Python中一个重要的概念,它允许在捕获一个异常后抛出另一个异常,同时保留原始异常的信息。

复制代码
def process_data():
    try:
        # 模拟一个原始异常
        raise ValueError("原始数据错误")
    except ValueError as e:
        # 在处理过程中抛出新的异常
        raise RuntimeError("处理数据时发生错误") from e

try:
    process_data()
except RuntimeError as e:
    print(f"捕获的异常: {e}")
    print(f"原始异常: {e.__cause__}")

'''
输出:
捕获的异常: 处理数据时发生错误
原始异常: 原始数据错误
'''

异常链的两种形式

隐式异常链

当在except块中抛出新的异常时,Python会自动创建异常链。

复制代码
def implicit_chaining():
    try:
        # 第一个异常
        raise ValueError("第一个错误")
    except ValueError:
        # 在except块中直接抛出新异常
        raise RuntimeError("第二个错误")

try:
    implicit_chaining()
except RuntimeError as e:
    print(f"当前异常: {e}")
    print(f"隐式上下文: {e.__context__}")
'''
输出:
当前异常: 第二个错误
隐式上下文: 第一个错误
'''

显式异常链

使用raise ... from ...语法明确指定异常链关系。

复制代码
def explicit_chaining():
    try:
        raise ValueError("原始错误")
    except ValueError as original_error:
        # 明确指定异常链
        raise RuntimeError("新错误") from original_error

try:
    explicit_chaining()
except RuntimeError as e:
    print(f"当前异常: {e}")
    print(f"显式原因: {e.__cause__}")
''''
输出:
当前异常: 新错误
显式原因: 原始错误
'''

异常链的属性

属性 描述
__cause__ 使用from明确指定的直接原因
__context__ 自动捕获的上下文异常
__traceback__ 异常的跟踪信息
相关推荐
充钱大佬7 小时前
Python测试基础教程
python·log4j·apache
初心丨哈士奇10 小时前
Python 四大基础容器|列表篇
python
明理的信封10 小时前
AI 基础设施的“去 Python 化“:Rust 与 C# 的两条替代路径
人工智能·python·rust
麻雀飞吧12 小时前
2026年AI量化开发,先跑通小流程再加复杂功能
人工智能·python
daphne odera�12 小时前
PyCharm 中 Codex 插件启动失败:unknown variant default 的解决方法
python·chatgpt·pycharm
nbu04william12 小时前
Deepseek-api省token的用法
python·大模型·token·deepseek
测试老哥13 小时前
Pytest自动化测试详解
自动化测试·软件测试·python·测试工具·测试用例·pytest·接口测试
坚持学习前端日记13 小时前
国产化适配全流程适配英伟达本地开发
人工智能·python
源图客13 小时前
云途物流API开发-鉴权认证(Java)
java·网络·python
三川69814 小时前
Tkinter库的学习记录06-变量类别
python