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 0 of the process.
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.
Object.getOwnPropertyDescriptor(new Error(), 'stack');
Object.getOwnPropertyDescriptor(Error.prototype, 'stack');
node/Chrome: 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 thestack
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.
Error.prototype.stack
is set in stone - this is a defacto reality, and will be implemented in Annex B.
You can view the spec in markdown format or rendered as HTML.