Error stack

Charles Kendrick charles at
Thu Jun 7 15:06:41 PDT 2012

Thanks for taking this on Erik.

I would suggest the following, which is mostly based on the
information it was possible to extract from IE6 (which is amazingly
still the leader in programmatic access to error information) as well
as information we were able to get by writing a Firefox extension.

All of the following might be optionally enabled, similar to
Error.stackTraceLimit, if you think it's too verbose.

1. show the parameter values

.. and do so intelligently:

a. Show Arrays with length: Array[5]

b. truncate long strings and show length: "the quick brown fox jumped ..."[45]

c. format dates compactly: Date(2012/5/2 5:00)

d. for Objects, use the toString() method if it's been customized on
the object, and for other objects instead of [Object object] pick
salient properties such as ID/id, name, title, type, or label.

For example, in our traces we would show Obj{title:"foo"} if an Object
with no customized toString() were present as a parameter and it
happened to have a "title" property.

This is a general strategy for dumping the value of something shown in
a stack trace and is assumed for other features below.

2. show the value of "this" if it's not the window

This is extremely important in OO frameworks.  It tells you exactly
what instances are involved in the call stack.  Traces that go through
recursive algorithms can be almost useless without this.

For example:

ReferenceError: doSomething is not defined
    at f ( [on Obj{ID:"foo"}]
    at g (eval at h (

3. optionally show the line of code that crashed

ReferenceError: doSomething is not defined
        code: this.doSomething()
    at f (
    at g (eval at h (

3. optionally show the line of code that calls down to the next frame

ReferenceError: doSomething is not defined
        code: this.doSomething()
    at f (
        code: if (something) f();
    at g (eval at h (
        code: g(currentValue);

4. optionally dump all non-parameter local variables for the crashing frame

ReferenceError: doSomething is not defined
        code: this.doSomething()
            value: 5
            parent: Obj{name:"foo"}
    at f ( [on: Obj{ID:1}]
        code: if (something) f();


A couple quick notes: some might argue this is pushing stacks to do
things debuggers do.  But, you don't have a debugger when you are
trying to solve a problem in a live application, and you don't have a
debugger when a customer is sending you logs and you can't even access
the application.

But with stack traces like the above, especially when combined with
good logging, you can be almost psychic when analyzing issues.

This information is very easy for the browser implementer to retrieve
so I don't think it imposes an undue burden, and from my 13 years of
experience helping customers with issues in a large JavaScript
framework, I can tell you that the value is difficult to overstate.

On Thu, Jun 7, 2012 at 11:37 AM, Erik Arvidsson
<erik.arvidsson at> wrote:
> I wrote a new strawman for Error stack which is now available in some
> form in all major browser (if betas are considered).
> Feedback wanted.
> --
> erik
> _______________________________________________
> es-discuss mailing list
> es-discuss at

More information about the es-discuss mailing list