正确创建带 cause 的 error 需传入 { cause: err } 作为第二个参数,如 throw new error("解析失败", { cause: parseerr });错误写法 throw new error("解析失败", parseerr) 会忽略 cause。

能用,但必须确认运行时支持(Node.js ≥16.9 或 Chrome ≥100),否则 cause 会被静默忽略。
如何正确创建带 cause 的 Error
直接传入 { cause: err } 作为第二个参数,不能写成 new Error(message, err) 这种错误形式 —— 后者会被当作 options 的占位符,实际不生效。
-
throw new Error("解析失败", { cause: parseErr });✅ 正确 -
throw new Error("解析失败", parseErr);❌ 错误:parseErr被当作文本描述,cause不会设置 - 如果
err是null或undefined,cause会被设为undefined,不会报错但失去链路意义
访问和遍历 cause 链的实用方式
error.cause 是单向引用,不是数组;要完整展开需手动递归或循环。日志系统若只打印 error.stack,默认不包含 cause 内容,必须显式处理。
- 简单展开一层:
console.error(error.message, "caused by:", error.cause?.message); - 安全遍历链路(避免无限循环):
function logErrorChain(err, depth = 0) { console.error(`${" ".repeat(depth)}→ ${err.message} (${err.name})`); if (err.cause && depth - 注意:
err.cause可能是任意值(比如字符串、数字),不一定是Error实例,访问.stack前应先instanceof Error判断
常见被忽略的兼容性陷阱
即使语法合法,cause 在旧环境里不会报错,而是直接丢弃 —— 这导致本地开发正常、线上报错链断裂,极难排查。
- Node.js:低于
16.9版本(如 14.x、16.0–16.8)完全不支持,cause字段不会出现在序列化结果中 - 浏览器:Chrome
100、Firefox101、Safari16.4才开始支持;微信小程序基础库 ≤2.28.1仍不识别 - JSON 序列化时
cause默认丢失:JSON.stringify(error)不包含cause,需自定义toJSON方法或使用专用序列化工具
真正麻烦的不是写法,而是跨服务、跨进程、跨语言时 cause 链天然断裂 —— 它只在单个 JavaScript 运行时内有效。想做分布式追踪,得靠额外协议(如 W3C Trace Context)补全,不能只依赖 cause。










