Error stacks S1
中文标题:错误堆栈
- 阶段: Stage 1
- 状态: 进行中
- ECMAScript 版本: —
- 同步时间: 2026年8月26日
- English original · 官方仓库
该提案标准化了事实上的 Error.prototype.stack 属性,解决不当标准化带来的安全隐患。它梳理了 V8、Safari 和 Firefox 的现有实现,并提出了 Annex B 规范。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
错误堆栈
ECMAScript 提案,针对 Error.prototype.stack/System.getStack/System.getStackString 的规范和参考实现
理由
在语言规范中,错误从未附带过堆栈跟踪——然而,各实现一直非常一致地在实例化的 Error 对象上提供了一个名为 "stack" 的属性。长期以来,人们一直担心不恰当地标准化堆栈跟踪——这样实现就无法在保持完全合规的同时提供安全保证。该提案以解决这些安全问题的方式,尝试标准化现有浏览器行为的交集。
兼容性
Node 7-20 和 Chrome 54-114 中的 V8:stack 是 Error 实例上的自有属性,声称是一个值属性({"value":"(stack here)","writable":true,"enumerable":false,"configurable":true),但 V8 的 Error 具有特殊的 [[GetOwnProperty]] 行为,该行为在第一次访问时(如果之前没有设置过)表现得像 getter 一样,触发 prepareStackTrace 并设置 stack,如该线程中所讨论。之后,它表现得像一个标准的 value 属性。
Node <= 6 和 Chrome <= 53,以及 Node >= 21 和 Chrome >= 115 中的 V8:stack 是 Error 实例上的自有属性,带有 getter/setter:{ configurable: true, enumerable: false }
- 当接收者不是 Error 时,getter 返回
undefined,否则返回stack属性(无论其当前值是什么)。 - 当接收者是非 Error 对象时,setter 是空操作,否则设置
stackgetter 的返回值。
Safari:stack 是 Error 实例上的自有字符串数据属性:{ configurable: true, enumerable: false, writable: true }
Firefox:stack 是 Error.prototype 上的自有属性:{ configurable: true, enumerable: false }
- 当接收者不是 Error 时,getter 抛出异常,否则返回原始堆栈跟踪。
- 当接收者不是 Error 时,setter 设置
stack属性,而当接收者是 Error 时是空操作。
命名
Error.prototype.stack 已经固定——这是事实上的标准,将在 Annex B 中实现。
规范
您可以查看以 HTML 渲染的规范。