For AI agents: the complete documentation index is available at /tc39-atlas/llms.txt, the full documentation bundle is available at /tc39-atlas/llms-full.txt, and this page is available as Markdown at /tc39-atlas/proposals/year/pending/proposal-error-stacks.md.
  • 简体中文
  • Error stacks S1

    中文标题:错误堆栈

    提案概览
    提案速览

    该提案标准化了事实上的 Error.prototype.stack 属性,解决不当标准化带来的安全隐患。它梳理了 V8、Safari 和 Firefox 的现有实现,并提出了 Annex B 规范。

    Note

    以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。

    错误堆栈

    ECMAScript 提案,针对 Error.prototype.stack/System.getStack/System.getStackString 的规范和参考实现

    规范由 @ljharb@erights 共同起草。

    该提案目前处于流程第 1 阶段

    理由

    在语言规范中,错误从未附带过堆栈跟踪——然而,各实现一直非常一致地在实例化的 Error 对象上提供了一个名为 "stack" 的属性。长期以来,人们一直担心不恰当地标准化堆栈跟踪——这样实现就无法在保持完全合规的同时提供安全保证。该提案以解决这些安全问题的方式,尝试标准化现有浏览器行为的交集。

    兼容性

    Object.getOwnPropertyDescriptor(new Error(), 'stack');
    Object.getOwnPropertyDescriptor(Error.prototype, 'stack');

    Node 7-20 和 Chrome 54-114 中的 V8:stackError 实例上的自有属性,声称是一个值属性({"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:stackError 实例上的自有属性,带有 getter/setter:{ configurable: true, enumerable: false }

    • 当接收者不是 Error 时,getter 返回 undefined,否则返回 stack 属性(无论其当前值是什么)。
    • 当接收者是非 Error 对象时,setter 是空操作,否则设置 stack getter 的返回值。

    Safari:stackError 实例上的自有字符串数据属性:{ configurable: true, enumerable: false, writable: true }

    Firefox:stackError.prototype 上的自有属性:{ configurable: true, enumerable: false }

    • 当接收者不是 Error 时,getter 抛出异常,否则返回原始堆栈跟踪。
    • 当接收者不是 Error 时,setter 设置 stack 属性,而当接收者是 Error 时是空操作。

    命名

    Error.prototype.stack 已经固定——这是事实上的标准,将在 Annex B 中实现。

    规范

    您可以查看以 HTML 渲染的规范。