Get the actual Javascript Error object with window.onerror

JavascriptError HandlingOnerror

Javascript Problem Overview


Javascript has this great callback window.onerror. It's quite convenient to track any error. However, it calls with the error name, the file name and the line. It's certainly not as rich as getting the actual error object from a try...catch statement. The actual error object contains a lot more data, so I am trying to get that. Unfortunately, try...catch statement do not work fine when you start having async code.

Is there a way to combine and get the best of both worlds? I initially looked for a way to get the last error triggered within an onerror block, but it looks like JS doesn't store that.

Any clue?

Javascript Solutions


Solution 1 - Javascript

this is now possible in some browsers. The spec was updated to include the actual error with stacktrace as the 5th parameter.

the problem is that not every browser supports this yet, so you could do something like this:

window.onerror = function(message, filename, lineno, colno, error)
{
    if(error != null)
    {
	    //handle the error with stacktrace in error.stack
    }
    else
    {
    	//sadly only 'message', 'filename' and 'lineno' work here
    }
};

Solution 2 - Javascript

If you're referring to stack trace of the error object, then AFAIK, this is not possible.

Simple reason being that a stack trace is related to an execution context in which runtime exceptions (handled with try...catch...finally) were created or thrown (with new Error() or throw).

Whereas when window.onerror is invoked, it is called within a different context.

You can get some mileage by inspecting window.event (not available on FF) in your onerror handler.

Solution 3 - Javascript

Modern browsers fully support the HTML 5 draft spec for ErrorEvent and window.onerror. In both of these browsers you can either use window.onerror, or (amazingly!) bind to the 'error' event properly:

// Only Chrome & Opera pass the error object.
window.onerror = function (message, file, line, col, error) {
    console.log(message, "from", error.stack);
};
// Only Chrome & Opera have an error attribute on the event.
window.addEventListener("error", function (e) {
    console.log(e.error.message, "from", e.error.stack);
});

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJulien GenestouxView Question on Stackoverflow
Solution 1 - JavascriptArchaeronView Answer on Stackoverflow
Solution 2 - JavascriptMrchiefView Answer on Stackoverflow
Solution 3 - JavascriptFizer KhanView Answer on Stackoverflow