fun_a() as the body onload handler. The
fun_a() function in turn calls
fun_b(), which calls
The first thing you need to do is catch this error before it becomes visible to the user. You will give the user a chance to submit error information, but you don't want him or her to see anything else. The goal is to reduce the user's exposure to the error.
This is simple to do. Assume the main program is invoked via the following function:
// Program goes here.
fun = tb_wrap( fun );
Note the call to
tb_wrap(). This puts
fun() inside a wrapper that traps any exceptions and handles them. Thus, the user doesn't see any exceptions that happen within
Gathering Error Information
Once you've trapped the error, you need to extract as much information about it as you can. The more error data you send back to developers, the more likely they are to find and fix the bug.
Unfortunately, error objects have different properties depending on which browser the user is running. Most of the time, you can count on the name and message properties. The stack property, which contains an extremely useful stack trace, is available only in recent versions of Mozilla-derived browsers.
Creating a Mailto: Link
To get users to send you information about the error, you offer them a link they can click. This is nice because it lets the users decide whether they want to bother or not, they can avoid sending multiple copies of the same bug report.
The mailto: link opens up the user's email program, filling in the Subject and Body fields like this:
Subject: Error from http://myserver.com/myapp/index.cgi?id=234
ReferenceError: nonexistent_variable is not defined
onload([object Event])@:0 @:0
The user can add any additional information they like, and then send the message.