使用window.onerror报告客户端错误的最佳做法?

时间:2011-10-26 05:20:14

标签: javascript logging error-handling

我想在我们的网站上捕获所有客户端JavaScript错误并记录它们。这样做的最佳做法是什么?

思想:

  • 我可以轻松地向我们的webapp添加/log/处理程序,解析GET / POST参数并使用我们现有的服务器端日志系统。这太明显了吗?
  • window.onerror到处都有效吗?如果处理程序中发生错误怎么办?
  • 我应该在页面上附加<img>标记还是制作XmlHttpRequest?如果XHR失败怎么办?
  • 破碎的图像和jQuery Ajax失败怎么样 - 我也可以抓住它们吗?

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

日志处理程序听起来不错,但我会限制报告的数量或尝试报告。例如,您不希望报告者出错,然后尝试反复报告。此外,如果你有一个糟糕的客户或流量高峰,你不想记录太多。

另外,window.onerror对iframe不起作用,我会做xmlhttprequest,如果你已经遇到问题,你不想搞砸dom吗

TL; DR;限制客户端请求并在服务器上强制执行限制。 window.onerror对iframe不利,并使用xmlhttprequest。

答案 2 :(得分:3)

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

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

$("img#my-image").error(onImgError).prop("src", "images/my-image.jpg");

您不会以这种方式获得太多信息,只是在尝试加载指定元素时发生错误这一事实。

您可以通过在传递给$ .ajax的设置对象中包含错误回调函数来处理jQuery.ajax请求中的失败。一定要将代码包装在try-catch的成功和错误回调函数中。

通常,您需要使用try-catch块保护代码,以便捕获并记录错误。处理window.onerror应该是最后的手段 - 对于那些漏洞的事情。

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

答案 3 :(得分:3)

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

我们使用的简单代码可以在https://github.com/shyam-habarakada/js-watson

的github上找到

凭借谷歌分析的所有分析能力和这种简单的技术,我们在识别频繁和严重错误方面取得了巨大成功,并且能够快速解决它们。您还可以使用GA的强大功能来分析整体错误的趋势,特定文件中的特定错误等。强烈建议。