【问题标题】:Catch all JavaScript errors and send them to server [closed]捕获所有 JavaScript 错误并将它们发送到服务器 [关闭]
【发布时间】:2011-07-16 17:39:53
【问题描述】:

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

我觉得我的意思很清楚了,我想知道客户端发生的每一个异常、错误、编译错误等,并发送到服务器上报告。

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

【问题讨论】:

    标签: javascript error-handling client-side


    【解决方案1】:

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

    错误处理程序可以捕获以下场景,

    1. 无法捕获未捕获的 TypeError
    2. 无法捕获未捕获的 ReferenceError 例如: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
          }
       })
    })
    

    【讨论】:

      【解决方案2】:

      如果您的网站使用 Google Analytics,您可以按照我的做法:

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

      上面代码的几个cmet:

      • 对于现代浏览器,会记录完整的堆栈跟踪。
      • 对于不捕获堆栈跟踪的旧浏览器,将记录错误消息。 (根据我的经验,大多数是早期的 iO​​S 版本)。
      • 还会记录用户的浏览器版本,因此您可以查看哪些操作系统/浏览器版本引发了哪些错误。这简化了错误优先级排序和测试。
      • 如果您将 Google Analytics 与“analytics.js”一起使用,则此代码有效,like this。如果您改用“gtag.js”like this,则需要调整函数的最后一行。 See here for details

      代码到位后,您可以通过以下方式查看用户的 Javascript 错误:

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

      【讨论】:

        【解决方案3】:

        我会去看看window.onerror

        例子:

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

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

        【讨论】:

        • 您最好在运行其他任何东西之前分配 window.onerror 。所以无论你想把它放在哪里,只要确保它在你的任何其他 js 代码/文件之前运行。
        • 注意,Mozilla 建议:'注意一些/许多错误事件不会触发 window.onerror,你必须专门监听它们。'
        • Mozilla 公开 GlobalEventHandlers.onerror: developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
        • 如果处理 window.onerror 的代码本身抛出错误会发生什么。有没有无限循环的可能?
        • @MartinBrown 在 Chrome 和 Firefox 中的一个简短测试似乎表明错误处理期间的错误不会递归处理,防止无限循环,假设所有错误都在同一个事件循环任务期间抛出(即,没有 @ 987654324@、setTimeoutsetInterval 或其他宏/微任务调用):var errNum = 0; window.addEventListener('error', () => { console.log(Error #${++errNum}); throw new Error(); }); setTimeout(() => {throw new Error()}, 100);
        猜你喜欢
        • 1970-01-01
        • 2010-10-21
        • 2012-01-08
        • 1970-01-01
        • 2023-03-30
        • 2016-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多