捕获所有 JavaScript 错误并将它们发送到服务器 [已关闭]

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

提问人:Olivier Girardot 提问时间:3/17/2011 最后编辑:Sebastian SimonOlivier Girardot 更新时间:8/6/2021 访问量:98246

问:

2年前关闭。
锁定。这个问题及其答案被锁定,因为这个问题偏离了主题,但具有历史意义。它目前不接受新的答案或互动。

我想知道是否有人有全局处理 JavaScript 错误并将其从客户端浏览器发送到服务器的经验。

我想我的观点很清楚,我想知道客户端发生的每一个异常、错误、编译错误等,并将它们发送到服务器进行报告。

我主要使用 MooTools 和(用于 JS 端)和 Django 用于服务器端。head.js

JavaScript 错误处理 客户端

评论


答:

321赞 Mike Lewis 3/17/2011 #1

我会检查window.onerror

例:

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

请记住,返回 true 将阻止触发默认处理程序,返回 false 将允许默认处理程序运行。

评论

9赞 Mike Lewis 3/17/2011
您最好在运行其他任何内容之前分配 window.onerror。因此,无论您想将其放在哪里,只需确保它在任何其他 js 代码/文件之前运行即可。
19赞 Adam Naylor 10/8/2012
请注意,Mozilla建议:“请注意,某些/许多错误事件不会触发window.onerror,您必须专门侦听它们。
8赞 roland 8/21/2015
Mozilla 公开 GlobalEventHandlers.onerror: developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/...
3赞 Martin Brown 6/5/2017
如果处理 window.onerror 的代码本身引发错误,会发生什么情况。有无限循环的可能性吗?
2赞 Mike Hill 7/8/2020
@MartinBrown Chrome 和 Firefox 中的简短测试似乎表明,错误处理过程中的错误不会递归处理,从而防止无限循环,假设所有错误都是在同一事件循环任务(即 no 、 、 或其他宏/微任务调用)期间抛出的: 错误 #${++errNum}PromisesetTimeoutsetIntervalvar errNum = 0; window.addEventListener('error', () => { console.log(); throw new Error(); }); setTimeout(() => {throw new Error()}, 100);
24赞 Martin Omander 6/14/2018 #2

如果您的网站使用的是 Google Analytics,您可以执行我的工作:

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

对上述代码的几点评论:

  • 对于现代浏览器,将记录完整的堆栈跟踪。
  • 对于不捕获堆栈跟踪的旧版浏览器,将改为记录错误消息。(根据我的经验,主要是早期的 iOS 版本)。
  • 用户的浏览器版本也会被记录下来,因此您可以查看哪些操作系统/浏览器版本引发了哪些错误。这简化了 bug 优先级和测试。
  • 如果您将Google Analytics与“analytics.js”一起使用,则此代码有效,如下所示。如果你使用“gtag.js”,像这样,你需要调整函数的最后一行。有关详细信息,请参阅此处

代码到位后,您可以查看用户的 Javascript 错误:

  1. 在 Google Analytics(分析)中,先点击相应部分,然后点击报告。BehaviorTop Events
  2. 您将获得一个事件类别列表。单击列表中。window.onerror
  3. 您将看到 Javascript 堆栈跟踪和错误消息的列表。通过单击按钮并在显示的文本框中输入,将用户的操作系统/浏览器版本的列添加到报表中。Secondary dimensionEvent Label
  4. 该报告将如下面的屏幕截图所示。
  5. 为了将操作系统/浏览器字符串转换为更易于阅读的描述,我将它们复制粘贴到 https://developers.whatismybrowser.com/useragents/parse/

enter image description here

4赞 sam ruben 4/26/2019 #3

不要尝试使用第三方服务,而是尝试自己的服务。

错误处理程序可以捕获以下情况:

  1. 无法捕获未捕获的 TypeError
  2. 无法捕获未捕获的引用错误,例如:var.click()
  3. 可以捕获 TypeError
  4. 可以捕获语法错误
  5. 可以捕获 ReferenceError

要捕获 Javascript 错误,请执行以下操作:

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

要捕获 AngularJS 错误:

app.config(function ($provide) {
$provide.decorator('$exceptionHandler', function ($delegate) {
   return function (exception, cause) {
       //It will handle AngualarJS errors
      }
   })
})