Python异常链通过__cause__(显式raise...from)和__context__(隐式未处理异常捕获)建立可追溯因果关系,调试时默认展示双堆栈,支持日志记录与语义化错误封装。
Python 异常链通过两个核心属性实现错误上下文的显式与隐式关联:`__cause__` 和 `__context__`。它不是简单地“抛出一个异常”,而是建立可追溯的因果关系,让调试时既能看清当前问题,也能快速定位原始诱因。

当你写 raise NewError("xxx") from orig_exc,Python 会把 orig_exc 赋值给新异常的 __cause__ 属性。这表示“这个新异常是**直接由**原异常导致的”。
e.__cause__ 直接访问原始异常对象raise NewError(...) from None 可主动切断链,避免干扰如果没写 from,但当前作用域里刚发生过一个未被处理的异常(比如在 except 块里又抛了另一个异常),Python 会自动把那个异常存进新异常的 __context__。
__cause__ 优先级低,__cause__ 存在时不会显示 __context__
异常链的价值在日志和终端输出里立刻体现:
__cause__ 的完整 traceback(两段堆栈)logging.exception() 记录,会自动包含整个链__str__ 或添加方法,主动暴露 __cause__ 的关键信息