Catch all JavaScript errors and send them to server [closed]
Asked Answered
B

3

248

I wondered if anyone had experience in handling JavaScript errors globally and send them from the client browser to a server.

I think my point is quite clear, I want to know every exception, error, compilation error, etc. that happens on the client side and send them to the server to report them.

I’m mainly using MooTools and head.js (for the JS side) and Django for the server side.

Ballroom answered 16/3, 2011 at 16:9 Comment(0)
M
321

I'd check out window.onerror

Example:

window.onerror = function(message, url, lineNumber) {  
  //save error and send to server for example.
  return true;
};  

Keep in mind that returning true will prevent the firing of the default handler, and returning false will let the default handler run.

Mohammedmohammedan answered 16/3, 2011 at 16:13 Comment(7)
Will this function be called in the main html page, if there is issue when loading other js files ?Ballroom
You would want to assign window.onerror preferably before anything else gets run. So wherever you want to put it, just make sure it runs before any of your other js code/files.Mohammedmohammedan
Note, Mozilla recommends: 'Note that some/many error events do not trigger window.onerror, you have to listen for them specifically.'Rag
Mozilla exposes GlobalEventHandlers.onerror: developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…Brynhild
What happens if the code that handles window.onerror itself throws an error. Is there a possibility of an infinite loop?Itemize
hi @Mike Lewis, i want capture all error and i need store those in one variable, how can i do?, any suggestion?Wort
@MartinBrown A brief test in Chrome and Firefox seems to show that errors during error handling are not recursively handled, preventing infinite loops, assuming all errors are thrown during the same event loop task (i.e., no Promise, setTimeout, setInterval, or other macro/microtask calls): var errNum = 0; window.addEventListener('error', () => { console.log(Error #${++errNum}); throw new Error(); }); setTimeout(() => {throw new Error()}, 100);Apfelstadt
T
24

If your website is using Google Analytics, you can do what I do:

window.onerror = function(message, source, lineno, colno, error) {
  if (error) message = error.stack;
  ga('send', 'event', 'window.onerror', message, navigator.userAgent);
}

A few comments on the code above:

  • For modern browsers, the full stack trace is logged.
  • For older browsers that don't capture the stack trace, the error message is logged instead. (Mostly earlier iOS version in my experience).
  • The user's browser version is also logged, so you can see which OS/browser versions are throwing which errors. That simplifies bug prioritization and testing.
  • This code works if you use Google Analytics with "analytics.js", like this. If you are using "gtag.js" instead, like this, you need to tweak the last line of the function. See here for details.

Once the code is in place, this is how you view your users' Javascript errors:

  1. In Google Analytics, click the Behavior section and then the Top Events report.
  2. You will get a list of Event Categories. Click window.onerror in the list.
  3. You will see a list of Javascript stack traces and error messages. Add a column to the report for your users' OS/browser versions by clicking the Secondary dimension button and entering Event Label in the textbox that appears.
  4. The report will look like the screenshot below.
  5. To translate the OS/browser strings to more human-readable descriptions, I copy-paste them into https://developers.whatismybrowser.com/useragents/parse/

enter image description here

Theatricals answered 14/6, 2018 at 10:16 Comment(0)
S
4

Don't try to use third party services instead try for your own.

The Error Handlers can catch the below scenarios,

  1. Uncaught TypeError can't be captured
  2. Uncaught ReferenceError can't be captured eg: var.click()
  3. TypeError can be captured
  4. Syntax error can be captured
  5. ReferenceError can be captured

To Catch Javascript Errors:

window.addEventListener('error', function (e) {
  //It Will handle JS errors 
})

To Capture AngularJS Errors:

app.config(function ($provide) {
$provide.decorator('$exceptionHandler', function ($delegate) {
   return function (exception, cause) {
       //It will handle AngualarJS errors
      }
   })
})
Sheepdip answered 26/4, 2019 at 6:54 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.