#文章 利用 ES2022 的 Error.cause 在构造函数中保留原始错误:`new Error(msg, { cause: err })`。
- 错误链非枚举,不污染日志;可逐层访问 `err.cause` 获取完整堆栈与类型。
- 自定义错误类只需 super(message, { cause }) 即可自动继承该能力;TypeScript 需 `target/lib ≥ es2022`。

- 使用场景
- 多层架构(服务→服务、包装函数、微调用)中,顶层抛出的同时需要追踪根因。
- 数据库/网络异常被重新包装为业务错误(如 ConnectionTimeoutErrorDatabaseError → `ServiceUnavailableError`)。
- 单元测试断言:`expect(err.cause).toBeInstanceOf(原始错误类)`。

- 最佳实践
- 只在关键上下文加链,避免过度包装导致调试噪音。
- 手动记录:`console.error(err) 后紧跟 `console.error('Caused by:', err.cause)`;使用递归辅助函数 `logErrorChain/logFullErrorChain 打印完整链。
- 保持错误类型清晰,自定义类命名语义化,方便日志与监控筛选。

https://allthingssmitty.com/2025/11/10/error-chaining-in-javascript-cleaner-debugging-with-error-cause/
 
 
Back to Top