你在重新抛出异常时丢失了上下文——Error.cause 修复了这个问题
来源:dev.to/parsajiravand
📋 概述
异常处理有一个隐性但普遍的问题:你在调用栈深处捕获错误、包装上更描述性的消息重新抛出——但原始错误的堆栈跟踪和细节全丢了。日志只剩"Failed to load user 42",你不知道是网络超时、403 还是 JSON 解析错误。ES2022 的 Error.cause 选项彻底解决了这个问题:new Error(msg, {cause: originalErr}) 将原始异常附着到新异常上,调用方通过 err.cause 访问完整链路,形成从底层到顶层的异常链而非被压扁的消息字符串。
🔑 核心要点
- Error.cause(ES2022)将原始错误保存到新异常的 cause 属性上,而非丢弃。
- 形成 异常链而非字符串:每层添加上下文,err.cause.cause... 可遍历完整链路。
- 旧方案拼接消息 只保留文本——堆栈跟踪、错误类型、嵌套 cause 全部丢失。
- 所有主流环境已支持:Node.js 16.9+、Chrome 93+、Firefox 91+、Safari 15+。
💡 金句
With Error.cause, you get a chain, not a flattened string.
← 返回 Dev.to 首页