proposal-error-stacks
                                
                                 proposal-error-stacks copied to clipboard
                                
                                    proposal-error-stacks copied to clipboard
                            
                            
                            
                        ECMAScript Proposal, specs, and reference implementation for Error.prototype.stack / System.getStack
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 [[GetOwnProperty]]  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 undefinedwith a non-Error receiver, and returns thestackproperty (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 stackgetter 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 stackproperty 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 rendered as HTML.