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 相关文章推荐
JavaScript CSS修改学习第六章 拖拽
Feb 19 Javascript
深入分析JQuery和JavaScript的异同
Oct 23 Javascript
原生javascript实现图片弹窗交互效果
Jan 12 Javascript
JSON与XML的区别对比及案例应用
Nov 11 Javascript
JS实现的几个常用算法
Nov 12 Javascript
清除浏览器缓存的几种方法总结(必看)
Dec 09 Javascript
vue webuploader 文件上传组件开发
Sep 23 Javascript
Three.js利用dat.GUI如何简化试验流程详解
Sep 26 Javascript
微信小程序按钮点击跳转页面详解
May 06 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
Aug 27 Javascript
react国际化化插件react-i18n-auto使用详解
Mar 31 Javascript
JavaScript如何使用插值实现图像渐变
Jun 28 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 header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
Yii把CGridView文本框换成下拉框的方法
2014/12/03 PHP
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
PHP实现163邮箱自动发送邮件
2016/03/29 PHP
客户端静态页面玩分页
2006/06/26 Javascript
Ajax+Json 级联菜单实现代码
2009/10/27 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
页面加载完后自动执行一个方法的js代码
2014/09/06 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
2014/10/29 Javascript
js获取当前时间显示在页面上并每秒刷新
2014/12/24 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
jQuery UI插件实现百度提词器效果
2016/11/21 Javascript
JavaScript调试的多个必备小Tips
2017/01/15 Javascript
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
2017/07/12 Javascript
Vue的百度地图插件尝试使用
2017/09/06 Javascript
js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能
2018/01/09 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
浅谈Fetch 数据交互方式
2018/12/20 Javascript
vue+moment实现倒计时效果
2019/08/26 Javascript
js+canvas实现简单扫雷小游戏
2021/01/22 Javascript
Python 网页解析HTMLParse的实例详解
2017/08/10 Python
Python3 操作符重载方法示例
2017/11/23 Python
详解Django中六个常用的自定义装饰器
2018/07/04 Python
PyQt5+Pycharm安装和配置图文教程详解
2020/03/24 Python
利用Python制作动态排名图的实现代码
2020/04/09 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
2020/05/26 Python
带你学习Python如何实现回归树模型
2020/07/16 Python
Nike英国官网:Nike.com (UK)
2017/02/13 全球购物
2014乡镇“三八”国际劳动妇女节活动总结
2014/03/01 职场文书
股东协议书范本
2014/04/14 职场文书
代领毕业证委托书
2014/08/02 职场文书
小学标准化建设汇报材料
2014/08/16 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书
导游词之鲁迅祖居
2019/10/17 职场文书
《追风筝的人》:人心中的成见是座大山,但请不忘初心
2019/11/15 职场文书
Django分页器的用法你都了解吗
2021/05/26 Python