美文网首页
前端js错误监控系列一:js不同异常类型的捕获

前端js错误监控系列一:js不同异常类型的捕获

作者: tracyXia | 来源:发表于2019-10-17 16:23 被阅读0次

一、js异常的捕获

1.window.onerror

当javascript运行发生错误时,window会触发一个ErrorEvent接口的error事件,并执行window.onerror()。这是记录客户端错误并将其报告给服务器的最简单方法之一。

window.onerror = function(message, source, lineno, colno, error) { ... }
函数参数:

  • message:错误信息(字符串)。可用于HTML onerror=""处理程序中的event
  • source:发生错误的脚本URL(字符串)
  • lineno:发生错误的行号(数字)
  • colno:发生错误的列号(数字)
  • errorError对象(对象)

window.onerror含有详细的error堆栈信息,存在error.stack中。遗憾的是stack属性是非标准的,并且其实现在不同的浏览器中也有所不同。幸运的是,有一些工具可以标准化堆栈属性,以便在浏览器之间保持一致。例如,raven-js使用TraceKit标准化错误字符串

onerror.png
上图为不同浏览器对各个参数的支持,某些浏览器没有错误对象,就没有堆栈跟踪属性。这意味着这些浏览器无法从onerror捕获的错误中检索有价值的堆栈信息。默认情况下,Raven.js(Sentry的JavaScript SDK)会谨慎地使用内置方法来尝试自动将代码包装在try / catch块中。这样做是为了尝试捕获所有脚本中的错误消息和堆栈跟踪信息,而不管它们来自何处。

2.script error的解决方式

另外,需要注意的是当加载自非同源的脚本中发生语法错误时,为避免信息泄露,语法错误的细节将不会报告,而代之简单的**"Script error."**。这是浏览器所做的安全限制措施
解决方案1:
添加 crossorigin="anonymous" 属性。
添加跨域 HTTP 响应头:Access-Control-Allow-Origin: *
完成上述两步之后,即可通过 window.onerror 捕获跨域脚本的报错信息。
解决方案2:
难以在 HTTP 请求响应头中添加跨域属性时,还可以考虑 try catch 这个备选方案。可以在 catch 语句中手动上报捕获的异常。如果你使用sentry的raven.js的话,你会发现你什么都不用做,他依然可以帮你捕获到一些错误的非常具体信息,关键就是raven源码中的install方法中调用的_instrumentTryCatch函数起了作用,他通过tryCatch的方式wrap了一些关键函数,使得这些函数里的报错能够捕获

3.资源加载错误的捕获

当一项资源(如<img><script>加载失败,加载资源的元素会触发一个[Event]接口的事件,并执行该元素上的onerror()处理函数。这些error事件不会向上冒泡到window,不过能被window.addEventListener在捕获阶段捕获。

window.addEventListener('error', event => (){ 
  // 处理错误信息
}, true);
// true代表在捕获阶段调用,false代表在冒泡阶段捕获。

但这里需要注意,使用window.onerror和window.addEventListener('error')都能捕获运行错误,但是window.onerror含有详细的error堆栈信息,存在error.stack中,所以我们选择使用onerror的方式对js运行时错误进行捕获。因此对addEventListener绑定的事件需要过滤避免重复上报,判断为资源错误的时候才进行上报。

4.未处理的promise错误

当promise被reject并且错误信息没有被处理的时候,会抛出一个unhandledrejection

这个错误不会被window.onerror以及window.addEventListener('error')捕获,但是有专门的window.addEventListener('unhandledrejection')方法进行捕获处理。

相关文章

  • 前端js错误监控系列一:js不同异常类型的捕获

    一、js异常的捕获 1.window.onerror 当javascript运行发生错误时,window会触发一个...

  • 前端异常监控window.onerror unhandledre

    关于前端异常监控,我们需要做到捕获JS异常和代码中未捕获的promise异常,然后向服务器上报 捕获JS异常 在了...

  • 报错监控-监控Promise错误

    上次我们聊过了前端监控 JS 执行错误和第三方资源加载异常的监控,那么这次来聊聊如何捕获 Promise 错误。 ...

  • 前端错误收集脚本

    前端错误分为 JS 运行时错误、接口错误、资源加载错误三种。对于前端的异常捕获,我们都会知道 onerror 事件...

  • 页面监控之监控页面报错

    监控js报错 错误示例 监控js报错的同时监控资源加载失败,即加上捕获选项即可 错误示例 监听ajax请求 监听未...

  • 前端错误监控

    前端错误的分类: 1、即使运行错误(js代码错误) 2、资源加载错误。 错误的捕获方式 1、即使运行错误(js代码...

  • 前端日志监控

    现行有一些已经开源的前端异常监控库,如腾讯的badJs,全栈js监控fundebug,国外的sentry等。 错误...

  • 一步一步搭建前端监控系统:JS错误监控篇

    摘要: 徒手写JS错误监控。 作者:一步一个脚印一个坑 原文:搭建前端监控系统(二)JS错误监控篇 Fundebu...

  • 前端监控体系建设

    前端监控体系主要分为错误监控、性能监控、业务监控及安全监控三个方面。 一、错误监控 (一)监控范围 js语法错误、...

  • Js error 监控

    一个全局监控js报错的模块,前端需要监控的有三点:1.js语法错误2.ajax请求3.静态资源加载错误 js语法错...

网友评论

      本文标题:前端js错误监控系列一:js不同异常类型的捕获

      本文链接:https://www.haomeiwen.com/subject/pzhmmctx.html