proposal-error-stacks

ECMAScript Proposal, specs, and reference implementation for Error.prototype.stack / System.getStack

  • Owner: tc39/proposal-error-stacks
  • Platform:
  • License:: MIT License
  • Category::
  • Topic:
  • Like:
    0
      Compare:

Github stars Tracking Chart

Error Stacks

ECMAScript Proposal, specs, and reference implementation for Error.prototype.stack/System.getStack/System.getStackString

Spec drafted by @ljharb along with @erights.

This proposal is currently stage 1 of the process.

Rationale

Errors have never had a stack trace attached in the language spec — however, implementations have very consistently provided one on a property named “stack” on instantiated Error objects. There has long been concern about standardizing stack traces improperly - such that implementations could not claim to be fully compliant while also providing security guarantees. This proposal is an attempt to standardize the intersection of existing browser behavior, in a way that addresses these security concerns.

Compatibility

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

V8 in Node 7+ and Chrome 54+: stack is an own property on Error instances which claims to be a value property ({"value":"(stack here)","writable":true,"enumerable":false,"configurable":true), but V8's Error has exotic behavior for that acts like a getter the first time (if there's been no set first) by triggering prepareStackTrace and setting stack, as discussed in this thread. After that, it behaves like a standard value property.

V8 in Node <= 6 and Chrome <= 53: stack is an own property on Error instances with a getter/setter: { configurable: true, enumerable: false }

  • The getter returns undefined with a non-Error receiver, and returns the stack property (whatever its current value may be) otherwise.
  • The setter is a no-op with a non-Error object receiver, and sets the return of the stack getter otherwise.

Safari: stack is an own string data property on Error instances: { configurable: true, enumerable: false, writable: true }

Firefox: stack is an own property on Error.prototype: { configurable: true, enumerable: false }

  • The getter throws on a non-Error receiver, and returns the original stack trace otherwise.
  • The setter sets the stack property on a non-Error receiver, and is a no-op on an Error receiver.

Naming

Error.prototype.stack is set in stone - this is a defacto reality, and will be implemented in Annex B.

Spec

You can view the spec in markdown format or rendered as HTML.

Main metrics

Overview
Name With Ownertc39/proposal-error-stacks
Primary LanguageHTML
Program languageHTML (Language Count: 1)
Platform
License:MIT License
所有者活动
Created At2016-10-24 22:23:20
Pushed At2024-02-08 17:25:54
Last Commit At
Release Count0
用户参与
Stargazers Count180
Watchers Count34
Fork Count12
Commits Count37
Has Issues Enabled
Issues Count44
Issue Open Count13
Pull Requests Count4
Pull Requests Open Count5
Pull Requests Close Count1
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private