当前位置: 首页 > news >正文

Python---异常链(Exception Chaining)

文章目录

  • 基本概念
    • 隐式异常链
  • 显式异常链(使用from)
  • 禁用异常链
  • 访问异常链
  • 实际应用场景
    • 1.转换异常类型
    • 2.添加上下文信息
    • 3.屏蔽底层细节
  • 最佳实践

异常链是指在处理一个异常时又引发了另一个异常,Python会自动将原始异常和新异常关联起来,形成异常链。

基本概念

Python中有两种异常链。

1、隐式异常链:当在except块中引发新异常时自动创建

2、显式异常链:使用raise … from …语法显式创建

隐式异常链

代码示例:

try:# 可能引发异常的代码1 / 0
except ZeroDivisionError:# 在处理过程中又引发了新异常(主动抛出新异常)raise ValueError("处理除零错误时出错")

输出会显示

Traceback (most recent call last):File "D:\PythonProject\Learn_250816\except_chain.py", line 3, in <module>1 / 0~~^~~
ZeroDivisionError: division by zeroDuring handling of the above exception, another exception occurred:Traceback (most recent call last):File "D:\PythonProject\Learn_250816\except_chain.py", line 6, in <module>raise ValueError("处理除零错误时出错")
ValueError: 处理除零错误时出错

显式异常链(使用from)

代码示例:

try:1 / 0
except ZeroDivisionError as original_error:raise ValueError("新错误") from original_error

输出会显示

Traceback (most recent call last):File "D:\PythonProject\Learn_250816\except_chain.py", line 10, in <module>1 / 0~~^~~
ZeroDivisionError: division by zeroThe above exception was the direct cause of the following exception:Traceback (most recent call last):File "D:\PythonProject\Learn_250816\except_chain.py", line 12, in <module>raise ValueError("新错误") from original_error
ValueError: 新错误

禁用异常链

使用from None可以禁用异常链

try:1 / 0
except ZeroDivisionError:raise ValueError("新错误") from None

输出只显示新异常

Traceback (most recent call last):File "D:\PythonProject\Learn_250816\except_chain.py", line 17, in <module>raise ValueError("新错误") from None
ValueError: 新错误

访问异常链

可以通过异常的__cause__和__context__属性访问异常链:

1、cause: 显式使用from设置的异常

2、context: 隐式关联的异常
测试代码1:

try:try:1 / 0except ZeroDivisionError as e:raise ValueError("新错误") from e
except ValueError as ve:print(f"当前异常: {ve}")print(f"显式原因: {ve.__cause__}")print(f"隐式上下文: {ve.__context__}")

输出显示1:

当前异常: 新错误
显式原因: division by zero
隐式上下文: division by zero

示例代码2:

try:try:1 / 0except ZeroDivisionError as e:raise ValueError("新错误")
except ValueError as ve:print(f"当前异常: {ve}")print(f"显式原因: {ve.__cause__}")print(f"隐式上下文: {ve.__context__}")

输出显示2:

当前异常: 新错误
显式原因: None
隐式上下文: division by zero

实际应用场景

1.转换异常类型

将底层异常转换为更高级别的异常

try:config = load_config()
except FileNotFoundError as e:raise ConfigurationError("配置文件缺失") from e

2.添加上下文信息

try:process_data(data)
except ProcessingError as e:raise ProcessingError(f"处理ID为{data.id}的记录时出错") from e

3.屏蔽底层细节

try:connect_to_database()
except DatabaseError:raise ServiceUnavailableError("服务暂时不可用") from None

最佳实践

1、使用raise … from …明确表达异常之间的关系

2、在需要屏蔽底层实现细节时使用from None

3、为自定义异常提供清晰的错误信息

4、在日志中记录完整的异常链信息

http://www.lryc.cn/news/622981.html

相关文章:

  • 完整设计 之 定稿 之:后现代元宇宙九宫格(重命名)-腾讯元宝答问
  • 线性代数之两个宇宙文明关于距离的对话
  • 分享一个大数据的源码实现 基于Hadoop的二手车市场数据分析与可视化 基于Spark的懂车帝二手车交易数据可视化分析系统
  • Transformer浅说
  • MySQL完整重置密码流程(针对 macOS)
  • 如何使用嵌入模型创建本地知识库Demo
  • MongoDB 聚合提速 3 招:$lookup 管道、部分索引、时间序列集合(含可复现实验与 explain 统计)
  • Tomcat类加载器原理简单介绍
  • AI热点周报(8.10~8.16):AI界“冰火两重天“,GPT-5陷入热议,DeepSeek R2模型训练受阻?
  • 服务器可以ping通,但部署的网站打不开
  • uniapp:微信小程序使用Canvas 和Canvas 2D绘制图形
  • nginx下载地址:aarch64
  • Scala面试题及详细答案100道(11-20)-- 函数式编程基础
  • 狗品种识别数据集:1k+图像,6个类别,yolo标注完整
  • linux docker neo4j 导出 (windows 导入)
  • duiLib 实现鼠标拖动状态栏时,窗口跟着拖动
  • 模型量化(Model Quantization)
  • 解决 Windows 下运行 MCP 脚本弹出 WSH 错误窗口的问题 | Windows Script Host
  • 【数据分析】比较SparCC、Pearson和Spearman相关性估计方法在合成组学数据上的表现
  • Footej Camera 2:专业级摄影体验,尽在掌中
  • 《代码重生:杨蓉与62.webp》
  • 2024-2025华为ICT大赛中国区 实践赛昇腾AI赛道(高职组)全国总决赛 理论部分真题+解析
  • 基本电子元件:金属氧化膜电阻器
  • 测试工程师的AI转型指南:从工具使用到测试策略重构
  • Vue组件基础解析
  • 机器学习--决策树
  • [Linux] RAID存储技术
  • 苍穹外卖日记
  • C:\Windows\WinSxS 目录详解
  • Python语言一键整理xhs评论 基于github的开源项目 MediaCrawler