写在前面
在前端监控 sdk 开发中,我们都会用到错误捕获,将页面各类错误进行捕获并上报日志,来获取错误信息,所以我们非常有必要深入了解下各类错误的错误捕获方式。
补充
setTimeout 错误捕获方式:https://www.cnblogs.com/beileixinqing/p/16987679.html
window.onerror 和window.addEventListener('error',fn,true)的区别 : https://www.cnblogs.com/beileixinqing/p/17013219.html
注意
错误捕获事件监听要写在最前面,即要保证在错误代码运行前已经监听
unhandledrejection 事件仅当 promise reject 且没有使用 catch 捕获的时候会触发
由于网络请求异常不会事件冒泡,因此必须在捕获阶段将其捕捉到才行,于是window.addEventListener 设置为 true 在捕获阶段进行
正文
错误信息是最基础也是最重要的数据,错误信息主要分为下面几类:
JS 代码运行错误、语法错误等
异步错误等
静态资源加载错误
接口请求报错
错误捕获方式
1)try/catch
只能捕获代码常规的运行错误,语法错误和异步错误不能捕获到
示例:
2) window.onerror
window.onerror 可以捕获常规错误、异步错误,但不能捕获资源错误
3) window.addEventListener
当静态资源加载失败时,会触发 error 事件, 此时 window.onerror 不能捕获到
示例:
4)Promise错误
Promise中抛出的错误,无法被 window.onerror、try/catch、 error 事件捕获到,可通过 unhandledrejection 事件来处理
示例:
Vue 错误
Vue项目中,window.onerror 和 error 事件不能捕获到常规的代码错误
异常代码:
控制台会报错, window.onerror 和 error 不能捕获到
控制台打印:
errorHandler源码分析
在src/core/util目录下,有一个error.js文件
通过源码明白了,vue 使用 try/catch 来捕获常规代码的报错,被捕获的错误会通过 console.error 输出而避免应用崩溃
可以在 Vue.config.errorHandler 中将捕获的错误上报
子组件代码:
同vue项目的处理类似,react项目中,可以在 componentDidCatch 中将捕获的错误上报
跨域问题
如果当前页面中,引入了其他域名的JS资源,如果资源出现错误,error 事件只会监测到一个 script error 的异常。
示例:
报错信息:
添加 crossorigin 后可以捕获到完整的报错信息:
如果不能修改服务端的请求头,可以考虑通过使用 try/catch 绕过,将错误抛出
接口错误
接口监控的实现原理:针对浏览器内置的 XMLHttpRequest、fetch 对象,利用 AOP 切片编程重写该方法,实现对请求的接口拦截,从而获取接口报错的情况并上报
1)拦截XMLHttpRequest请求示例:
2)拦截fetch请求示例:
错误捕获方式主要摘抄自:https://juejin.cn/post/7172072612430872584#heading-10,主要用来记录和学习,也推荐大家看看原博主的文章。
前端开发中的Error
参考链接:https://www.imooc.com/article/details/id/294329