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__ 异常的跟踪信息
相关推荐
python猿几秒前
打卡Python王者归来--第29天
python
幸福清风7 分钟前
【Python】运维效率翻倍|批处理日志分割升级Python GUI,一键打包exe无乱码,零基础也能用
python·打包·日志分割
小狗丹尼4001 小时前
JSON 基础认知、数据转换与 Flask 前后端交互全解
python·flask·json
zm-v-159304339863 小时前
Python 数据挖掘从入门到精通:回归 / 分类 / 聚类 / 关联分析完整教程
python·数据挖掘·回归
qq_417695058 小时前
机器学习与人工智能
jvm·数据库·python
漫随流水8 小时前
旅游推荐系统(view.py)
前端·数据库·python·旅游
yy我不解释9 小时前
关于comfyui的mmaudio音频生成插件时时间不一致问题(一)
python·ai作画·音视频·comfyui
紫丁香10 小时前
AutoGen详解一
后端·python·flask
FreakStudio10 小时前
不用费劲编译ulab了!纯Mpy矩阵micronumpy库,单片机直接跑
python·嵌入式·边缘计算·电子diy
清水白石00813 小时前
Free-Threaded Python 实战指南:机遇、风险与 PoC 验证方案
java·python·算法