Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用window.onerror报告客户端错误的最佳实践?_Javascript_Logging_Error Handling - Fatal编程技术网

Javascript 使用window.onerror报告客户端错误的最佳实践?

Javascript 使用window.onerror报告客户端错误的最佳实践?,javascript,logging,error-handling,Javascript,Logging,Error Handling,我希望捕获我们站点上的所有客户端JavaScript错误并记录它们。做这件事的最佳实践是什么 想法: 我可以轻松地将/log/处理程序添加到我们的webapp中,解析GET/POST参数并使用服务器端现有的日志系统。这是不是太明显了 window.onerror在任何地方都有效吗?如果处理程序中发生错误怎么办 我应该在页面上附加标记还是进行XmlHttpRequest?如果XHR失败怎么办 关于损坏的图像和jqueryajax失败,我也能抓住它们吗 日志处理程序听起来是个好主意,但我会限制报告

我希望捕获我们站点上的所有客户端JavaScript错误并记录它们。做这件事的最佳实践是什么

想法:

  • 我可以轻松地将
    /log/
    处理程序添加到我们的webapp中,解析GET/POST参数并使用服务器端现有的日志系统。这是不是太明显了
  • window.onerror
    在任何地方都有效吗?如果处理程序中发生错误怎么办
  • 我应该在页面上附加
    标记还是进行XmlHttpRequest?如果XHR失败怎么办
  • 关于损坏的图像和jqueryajax失败,我也能抓住它们吗

    • 日志处理程序听起来是个好主意,但我会限制报告的数量或报告的尝试次数。例如,你不希望报告者有一个错误,然后试图自己报告一遍又一遍。此外,如果你有一个坏客户或流量高峰,你不想记录太多

      另外,window.onerror不适用于iFrame,我会执行xmlhttprequest,如果您已经遇到问题,您是否不想弄乱dom


      TL;博士限制客户端请求并在服务器上实施限制。window.onerror不适用于iFrame,请使用xmlhttprequest。

      正如Jbecwar所建议的,日志处理程序是一个好主意,但您需要注意尝试调用日志处理程序以报告与日志处理程序联系的错误的情况。如果浏览器与服务器失去连接,您将无法将其记录回服务器

      通过将错误处理程序附加到img元素,然后设置其src属性,可以捕获img加载失败。例如,使用jQuery:

      $("img#my-image").error(onImgError).prop("src", "images/my-image.jpg");
      
      通过这种方式,您不会获得太多信息,只是在尝试加载指定元素时发生了错误

      通过在传递给$.ajax的设置对象中包含错误回调函数,可以处理jQuery.ajax请求中的失败。请确保在try-catch中的success和error回调函数中包装代码

      通常,您希望使用try-catch块来保护代码,以便捕获并记录错误。处理window.onerror应该是最后的手段——处理掉的东西


      在window.onerror处理程序中,将所有内容包装在try-catch块中,并确保不会从catch块中的代码中抛出(如有必要,使用嵌套的try-catch)。

      Jbecwar和dgvid提出的所有建议都很酷,我要补充:

      • 请注意,Opera不支持错误事件,请参阅
      • 使用收集堆栈跟踪有助于解决错误
      • 如果错误处理程序无法将错误报告发送到服务器端,请回退到使用cookies:使用base64编码的错误报告(压缩?)为errors.yourdomain.com设置cookie,并在每个页面上从该域请求空1x1像素图像
      • 或者使用HTML5本地存储,并在可以的时候上传

      我们最近开始将未处理的错误作为页面浏览量报告给谷歌分析。基本思想是window.onerror处理程序将错误信息(脚本文件路径、行号和错误消息)转换为虚拟错误页面url,并将其报告为页面视图。您可以将该逻辑应用于任何页面跟踪机制

      我们使用的简单代码可在github上获得,网址为


      凭借google analytics的强大分析能力和这项简单的技术,我们在识别频繁和关键错误方面取得了巨大成功,并能够快速解决这些错误。您还可以使用GA的强大功能来分析总体错误、特定文件中的特定错误等趋势。强烈推荐。

      谢谢大家!邦蒂带着最多的信息去了dgvid。Zoran得到了公认的答案,并提供了超集信息。事实上,Opera从11.60开始就支持它(来源:),请您进一步介绍一下您在iFrame和window.OneError中看到的问题,好吗?