编写代码只是作好项目的一小部分,写代码不免会碰到错误。所以,在项目上线后,咱们还须要主动对项目的错误进行收集,不能等用户发现错误,再联系咱们,咱们再去处理。这样很容易形成大的损失,提早作好错误收集和处理,能够减小损失。html
本人并无作过相关的工做,下面的文章只是我在学习中的一点思考和总结,可能有比较多不足和错误的地方,但愿你们指正和指导。前端
本文章为前端进阶系列的一部分,
欢迎关注和star本博客或是关注个人githubgit
先从一个面试题开始吧。腾讯第二轮电话面试的一个题目:若是用户使用网页,发现白屏,如今联系上了大家,大家会向他询问什么信息呢?github
<!-- more -->
一个个去堆答案没有意思,咱们换个思路,先想一下为何会白屏?web
跟我以前的性能优化的文章同样,咱们以用户访问页面的过程为顺序,大体排查一下面试
经过以上可能发生错误的环节,咱们须要向用户手机一下如下的用户信息ajax
如今话题来到了如何收集错误信息了。chrome
前端错误收集有两大流派:后端
一个是虚拟机监控,优势是指标齐全,而且能够进行竞品监控,缺点是反映不全,容易失真跨域
另外一个是脚本监控,优势是能够收集海量真实数据,缺点是影响性能,采样少的状况下容易失真。
这里暂时只讲脚本监控(挖个坑,以后可能填)
在chrome浏览器控制台输入Performance.timing,会获得记录了一个浏览器访问各阶段的时间的对象。
进行错误收集的时候,能够对比这些时间,看错误发生在什么阶段
记录访问开始的时间可有如下的方法:
记录访问过程的时间
window.onerror能够捕捉运行时错误,能够拿到出错的信息,堆栈,出错的文件、行号、列号
要注意如下几点:
promise除了使用catch方法来捕获错误,还可使用window的unhandledrejection事件捕获异常的
window.addEventListener("unhandledrejection", function(e){ // Event新增属性 // @prop {Promise} promise - 状态为rejected的Promise实例 // @prop {String|Object} reason - 异常信息或rejected的内容 // 会阻止异常继续抛出,不让Uncaught(in promise) Error产生 e.preventDefault() })
没法捕捉到语法错误,只能捕捉运行时错误;
能够拿到出错的信息,堆栈,出错的文件、行号、列号; 须要借助工具把全部的function块以及文件块加入try,catch,能够在这个阶段打入更多的静态信息。
要注意的是try catch只能捕获同步代码的异常,对回调,setTimeout,promise等无能为力
function report(error) { var reportUrl = 'http://xxxx/report'; new Image().src = reportUrl + 'error=' + error; }
本文章为前端进阶系列的一部分,
欢迎关注和star本博客或是关注个人github