Python笔记 - Exception chaining

在Python中,异常链接(Exception Chaining)是指在处理一个异常时抛出另一个异常的技术。这样可以保留原始异常的信息,同时提供新的异常信息。这种机制在调试和错误跟踪时特别有用,因为它保留了异常发生的完整上下文。

Python通过两个属性来支持异常链接:

  1. __cause__: 这是显式链的方式,用于显示一个异常是由另一个异常引发的。通过 raise new_exception from original_exception 语法来使用。

  2. __context__: 这是隐式链的方式,用于记录在处理一个异常的过程中发生的另一个异常。这在没有使用 from 语句时自动设置。

下面通过代码示例来解释这两种方式:

显式链 (__cause__)

python 复制代码
try:
    1 / 0
except ZeroDivisionError as e:
    raise ValueError("An error occurred while processing.") from e

在这个例子中:

  • ZeroDivisionError 是原始异常。
  • ValueError 是新的异常。
  • 使用 from e 明确指定 ValueError 是由 ZeroDivisionError 引发的。

隐式链 (__context__)

python 复制代码
try:
    1 / 0
except ZeroDivisionError:
    raise ValueError("An error occurred while processing.")

在这个例子中:

  • ZeroDivisionError 是原始异常。
  • ValueError 是新的异常。
  • 由于没有使用 from 语法,Python会自动将 ZeroDivisionError 作为 ValueError 的 __context__。

查看异常链

当异常被捕获并打印时,Python 会显示完整的异常链。

python 复制代码
try:
    try:
        1 / 0
    except ZeroDivisionError as e:
        raise ValueError("An error occurred while processing.") from e
except Exception as e:
    print(repr(e))
    print(repr(e.__cause__))
    print(repr(e.__context__))

输出将显示:

复制代码
ValueError('An error occurred while processing.')
ZeroDivisionError('division by zero')
None

在这种情况下:

  • e 是 ValueError 异常。
  • e.__cause__ 是 ZeroDivisionError 异常。
  • e.__context__ 是 None 因为我们使用了显式链。

总结

异常链接在Python中是一种强大的机制,允许开发者在处理异常时抛出新的异常,并保留原始异常的信息。通过 __cause__ 和 __context__ 属性,可以追踪到异常发生的完整链条,从而有助于更有效地调试和定位问题。

相关推荐
DP DPharness2 小时前
ClearAI、记忆插件与普通笔记,三种让 Agent 记住的路数对比
笔记
“AI国潮设计-小江”3 小时前
《Python+SDXL实战:用ControlNet精准控制“英歌舞翻糖吐司”构图,附批量生成脚本》
开发语言·人工智能·python·prompt·aigc
wenwen_chao3 小时前
Python学习与开发资源合集:实用技巧与工具推荐
python
for_ever_love__4 小时前
函数——参数、lambda、*args与作用域
python·函数·大模型开发·编程基础
东莞市云毅网络有限公司4 小时前
企业资料时效性判定:Last-Modified、正文日期与版本字段三路交叉
python·sqlite·自动化运维·geo·数据监测
Query*4 小时前
深入浅出LangGraph【一】_基础篇
python·ai·langchain
piikee5 小时前
粤语初学入门:从粤拼、九声六调到开口,一个普通话母语者的练习笔记
笔记·粤语入门·怎么学习粤语
XiaoMaqqqq5 小时前
市面上正规的IP驱动产业新场景新工具哪家强
运维·python·网络协议·tcp/ip
ShyanZh5 小时前
【Python3基础】19-Socket 与 TCP、UDP 编程
python·网络协议·tcp/ip·udp
惊讶的猫6 小时前
工具选对之后还不够:商城 Agent 的参数与权限治理
开发语言·python