JavaScript代码异常监控实现过程详解


Posted in Javascript onFebruary 17, 2020

这篇文章主要介绍了JavaScript代码异常监控实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

JavaScript异常一般有两方面:语法错误和运行时错误。两种错误的捕获和处理方式不同,从而影响具体的方案选型。通常来说,处理JS异常的方案有两种:try...catch捕获 和 window.onerror捕获。以下就两种方案分别分析各自的优劣。

虽然语法错误本应该在开发构建阶段使用测试工具避免,但难免会有马失前蹄部署到线上的时候。

try...catch捕获

这种方案要求开发人员在编写代码的时候,在预估有异常发生的代码段使用try...catch,在发生异常时将异常信息发送给接口:

try{
//可能发生异常的代码段
}catch(e){
//将异常信息发送服务端
}

try...catch的优点是可以细化到每个代码块,并且可以自定义错误信息以便统计。

具体到上文提到的两种js异常,try...catch无法捕获语法错误,当遇到语法错误时,浏览器仍然会抛出错误Uncaught SyntaxError,但是不会被捕获,不会走进catch的代码块内。

另外,如果try代码块中有回调函数也不会被捕获,比如:

try{
var btn = $('#btn');
  btn.on('click',function(){
    //throw error
  });
}catch(e){}

上述代码中btn的监听函数里抛出的异常无法被外层的catch捕获到,必须额外套一层:

try{
var btn = $('#btn');
  btn.on('click',function(){
    try{
      //throw error
    }catch(e){}
  });
}catch(e){}

综上所述,try...catch方案的部署非常复杂,如果人工部署除了要求巨量的工作量,还跟开发人员的能力和经验有关。如果依赖编译工具部署(比如fis),那每个代码块都套一层try...catch也是非常难看的并且容易引发一些不可预估的问题。

window.onerror捕获

这种方式不需要开发人员在代码中书写大量的try...catch,通过给window添加onerror监听,在js发生异常的时候便可以捕获到错误信息,语法异常和运行异常均可被捕获到。但是window.onerror这个监听必须放在所有js文件之前才可以保证能够捕获到所有的异常信息。

window.onerror事件的详细信息参考这里。

/**
 * @param {String} errorMessage  错误信息
 * @param {String} scriptURL   出错文件的URL
 * @param {Long}  lineNumber   出错代码的行号
 * @param {Long}  columnNumber  出错代码的列号
 * @param {Object} errorObj    错误信息Object
 */
window.onerror = function(errorMessage, scriptURL, lineNumber,columnNumber,errorObj) { 
  // code..
}

onerror的实现方式各浏览器略有差异,但是前三个参数都是相同的,某些低版本浏览器没有后两个参数。

最后一个参数errorObj各浏览器实现的程度不一致,具体可参考这里。

下图是被onerror捕获到的一个异常的具体信息:

JavaScript代码异常监控实现过程详解

综上所述,window.onerror方案的优点是减少了开发人员的工作量,部署方便,并且可以捕获语法错误和运行错误。缺点是错误信息不能自定义,并且errorObj每种浏览器的实现有略微差异,导致需统计的信息有局限性。

跨域JS文件异常的捕获

为了提高web性能,目前大部分web产品架构中都有CDN这一环,将资源部署到不同的域名上,充分利用浏览器的并发请求机制。那么在跨域JS文件中发生异常的时候,onerror监听会捕获到什么信息呢?请看下图:

JavaScript代码异常监控实现过程详解

只有一个稍微有价值的信息Script error,其他什么信息都没有,为什么会这样呢?

我们都知道浏览器有同源资源限制,常规状态下是无法进行跨域请求的。而script、img、iframe标签的src属性是没有这种限制的,这也是很多跨域方案的基础。但是即使script标签可以请求到异域的js文件,此文件中的信息也并不能暴露到当前域内,这也是浏览器的安全措施所致。

那么有没有办法获取到异域资源的异常信息呢?

其实很简单,目前可以说基本上所有的web产品对于js/css/image等静态资源都在服务端设置了Access-Control-Allow-Origin: *的响应头,也就是允许跨域请求。在这个环境下,只要我们在请求跨域资源的script标签上添加一个crossorigin属性即可:

<script src="http://static.toutiao.com/test.js" crossorigin></script>

这样的话,异域的test.js文件中发生异常时便可以被当前域的onerror监听捕获到详细的异常信息。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
Jan 12 Javascript
jquery绑定原理 简单解析与实现代码分享
Sep 06 Javascript
DWZ table的原生分页浅谈
Mar 01 Javascript
JS将所有对象s的属性复制给对象r(原生js+jquery)
Jan 25 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
Mar 02 Javascript
jquery实现滑屏大图定时收缩为小banner图片的广告代码
Sep 02 Javascript
jQuery使用each方法与for语句遍历数组示例
Jun 16 Javascript
JS简单实现禁止访问某个页面的方法
Sep 13 Javascript
JS 对java返回的json格式的数据处理方法
Dec 05 Javascript
vue-cli3 项目从搭建优化到docker部署的方法
Jan 28 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
Jun 11 Javascript
JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】
May 01 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
Feb 17 #Javascript
npx create-react-app xxx创建项目报错的解决办法
Feb 17 #Javascript
Vue的双向数据绑定实现原理解析
Feb 17 #Javascript
JavaScript函数Call、Apply原理实例解析
Feb 17 #Javascript
javascript异常处理实现原理详解
Feb 17 #Javascript
Vue+webpack实现懒加载过程解析
Feb 17 #Javascript
javascript History对象原理解析
Feb 17 #Javascript
You might like
php 攻击方法之谈php+mysql注射语句构造
2009/10/30 PHP
采用ThinkPHP中F方法实现快速缓存实例
2014/06/13 PHP
用JavaScript显示随机图像或引用
2009/04/21 Javascript
方便实用的jQuery checkbox复选框全选功能简单实例
2013/10/09 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
2014/03/13 Javascript
js中this的用法实例分析
2015/01/10 Javascript
AngularJS学习笔记之ng-options指令
2015/06/16 Javascript
微信小程序 基础知识css样式media标签
2017/02/15 Javascript
原生JS实现图片翻书效果
2017/02/16 Javascript
javascript实现滑动解锁功能
2017/03/22 Javascript
纯html+css+javascript实现楼层跳跃式的页面布局(实例代码)
2017/10/25 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
如何实现一个webpack模块解析器
2018/10/24 Javascript
微信小程序自定义导航栏实例代码
2019/04/05 Javascript
Python程序设计入门(5)类的使用简介
2014/06/16 Python
python实现马耳可夫链算法实例分析
2015/05/20 Python
Python实现配置文件备份的方法
2015/07/30 Python
Python序列操作之进阶篇
2016/12/08 Python
tensorflow实现简单的卷积网络
2018/05/24 Python
实例详解Python模块decimal
2019/06/26 Python
pandas进行时间数据的转换和计算时间差并提取年月日
2019/07/06 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
2019/08/09 Python
使用OpenCV实现仿射变换—旋转功能
2019/08/29 Python
python包的导入方式总结
2021/03/02 Python
美国在线眼镜商城:Eyeglasses.com
2017/06/26 全球购物
如何强制垃圾回收
2015/10/06 面试题
DOM和JQuery对象有什么区别
2016/11/11 面试题
银行会计职员个人的自我评价
2013/09/29 职场文书
中职生自我鉴定范文
2013/10/03 职场文书
工作自我评价分享
2013/12/01 职场文书
小学生安全演讲稿
2014/04/25 职场文书
2014年党支部承诺书
2014/05/30 职场文书
教师反腐倡廉演讲稿
2014/09/03 职场文书
正规欠条模板
2015/07/03 职场文书
2016年国培研修日志
2015/11/13 职场文书
Django实现在线无水印抖音视频下载(附源码及地址)
2021/05/06 Python