QA不是万能的,用户的浏览环境非常复杂,很多情况无法靠测试用例去覆盖,所以最好建立一个前端错误日志,在真实用户端收集bug。

try&catch是一个捕获前端错误的常见方法,比如:

{

//给所有脚本设置一个统一入口,比如设置一个init函数

init();

}catch(e){

//处理错误,将错误信息上报给服务器

}

像上面这样,所有脚本统一用init作为入口,一旦发生错误就会被try捕获,然后交给catch去处理。

这种做法虽然能够收集错误信息,但弊端是必须统一一个脚本入口,并且把入口放在try里面,所以在实现时会比较麻烦。

理想情况下,处理错误信息的脚本应该尽可能做到无痕,为了实现这一点,可以借助window.onerror事件。

在W3C规范里,window.onerror是html5新定义的事件,但实际上,window.onerror从IE6开始就被支持了,而chrome、firefox、safari、opera,目前也都已经支持该事件。

// 基于window.onerror 收集前端错误信息

window.onerror = function(message, url, line) {

if (!url) return;

var msg = {};

//记录客户端环境

msg.ua = window.navigator.userAgent;

//只记录message里的message属性就好了,

//错误信息可能会比较晦涩,有些信息完全无用,应酌情过滤

msg.message = message.message;

msg.url = url;

msg.line = line;

msg.page = window.location.href;

var s = [];

//将错误信息转换成字符串

for(var key in msg){

s.push(key + '=' + msg[key]);

}

s = s.join('&');

//这里是用增加标签的方法调用日志收集接口,优点是比较简洁。

new Image().src = '/ajax-jserror.php?' + encodeURIComponent(s) + '&t=' + Math.random();   

};

这段代码只要最好放到head标签里,放在所有script之前,这样当用户浏览时发生的JS错误就会上报到服务器了。

这里有几个点需要注意,一个是日志收集接口暴露在外,最好增加安全措施,比如设置token。

另外,脚本部署的时机、位置,以及日志过滤等条件,也需要根据具体情况进行设定。

onerror的事件绑定

如果想用事件绑定的方法处理window.onerror,有一点需要特别注意:

if(window.addEventListener){

/*

需要特别注意addEventListener的第三个参数,是否在捕获阶段处理

这个参数,大多数时候用的都是false

在这里,chrome、firefox也都可以用false

但是opera用false时就无法处理error

必须设置为true,在捕获阶段处理error,脚本才能正常运行

*/

window.addEventListener("error",fn,true);

}else if(window.attachEvent){

//ie在这里表示无压力

window.attachEvent("onerror",fn);

}

基于window.onerror事件 建立前端错误日志的更多相关文章

  1. [译]window.onerror事件

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  2. window.onerror事件用来自定义错误处理

    Event reference:      https://developer.mozilla.org/en-US/docs/Web/Events http://w3c.github.io/html/ ...

  3. 基于sentry的前端错误监控日志系统(部署sentry服务器/前端项目部署)-让前端最快的定位到生产问题

    背景 在这越来越发达的网络时代,web应用也是越来越复杂,尤其是前端的开发,也是越来越受重视. 所以在我们前端开发完成后,会有一些列的web应用的上线验证,如自测.QA测试.code review 等 ...

  4. window.onerror 应用实例

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp75   window.onerror = function(sMessa ...

  5. 前端异常日志监控 - 使用Sentry

    背景 现在的前端项目越来越复杂,在不同的客户端会产生各种在开发人员机器上不会出现的问题.当用户报告一个问题给开发人员的时候,开发人员无法直接定位问题.在此前,听过一次鹅厂的前端人员,他们对QQ里面的网 ...

  6. mvc里全局错误日志

    第一步在项目中找到App_Start文件夹下建立一个错误日志过滤器. 第二步在Global.asax文件中注册下日志过滤器 第三步: 继承一个ExceptionFilterAtrribute 第四步: ...

  7. 前端监控系统(二)JS错误日志收集篇

    前端监控系统 目前已经上线,欢迎使用! 服务器搭建好了,可以着手开发了. 其实前端需要分析的数据有很多,包括,PVUV, 接口请求统计,耗时统计,JS错误统计,用户使用设备统计,用户地域分布,页面用户 ...

  8. 前端js错误日志收集

    今天一个客户说他们的一个同事用OPPO R11的手机访问不了我们的项目,打开后一片空白,虽然后面发现你的手机网络断了,但是想起来毕竟手机端没有调试的工具可以查看抛出的错误信息,方便我们追踪问题,后端的 ...

  9. 运维开发实践——基于Sentry搭建错误日志监控系统

    错误日志监控也可称为业务逻辑监控, 旨在对业务系统运行过程中产生的错误日志进行收集归纳和监控告警.似乎有那么点曾相识?没错... 就是提到的“APM应用性能监控”.但它又与APM不同,APM系统主要注 ...

随机推荐

  1. Note_Master-Detail Application(iOS template)_02_YJYAppDelegate.m

    //YJYAppDelegate.m #import "YJYAppDelegate.h" #import "YJYMasterViewController.h" ...

  2. PP

  3. iOS之《 Human Interface Guidelines:from Concept to Product 》<界面设计指南 二>:从概念到产品的实现

    开发之前需要想到的: 1.列出所有用户可能喜欢的功能. 例子:食谱 (1)创建一个总的食谱菜单 (2)食谱的获取方法  (3)比较价格 (4)当地的食材店 (5)食谱每道菜的注释 (6)能够获取和使用 ...

  4. html input

    disabled="disabled" <input name="" type="checkbox" value="&quo ...

  5. Inno Setup的常用脚本

    Inno Setup的常用脚本 分类: VC++神奇理论 2012-12-06 10:07 3234人阅读 评论(2) 收藏 举报 安装不同的目录: [Files] Source: "我的程 ...

  6. Web页面性能测试工具浅析

    http://www.cnblogs.com/fo0ol/p/3297054.html 做Web开发,难免要对自己开发的页面进行性能检测,自己写工具检测,工作量太大.网上有几款比较成熟的检测工具,以下 ...

  7. xcrun: error: active developer path ("/Volumes/Xcode/Xcode6-Beta.app/Contents/Developer") does not exist, use xcode-select to change

    When using MacOS with xcode6.4, i always meet these error: xcrun: error: active developer path (&quo ...

  8. timeZoneGetter

    function timeZoneGetter(date) { // getTimezoneOffset 返回格林威治时间和本地时间之间的时差,以分钟为单位 var zone = -1 * date. ...

  9. css 包含的图片和style="display:none"可以避免图片加载,可以节省网络流量

    从别人那儿学到一招:先记录下来: <head> <meta charset="UTF-8"> <title>Document</title ...

  10. java 中获取文件路径

    方案一: 文件目录如下: 配置文件:firehosetos3sample.properties在src目录下面第一层,与包是一层的 在Getpath_ClassLoader.java类中: Syste ...