JS异常处理的一个想法(sofish)


Posted in Javascript onMarch 14, 2013

可能由于网络、浏览器问题、缓存等原因,可能导致线上执行 js 的时候与开发环境并不一样,会抛出异常。js 异常基本上是前端开发工程师的家常便饭。如何记录,并使用它,却很少人关注。最近在考虑一个想法,基本上涉及到两步:收集和使用。

一、收集
对于 error 收集这一块,还是比较方便的,因为在各浏览器中都有一个接口:window.onerror,代码如下:

window.onerror = function(errorMessage, scriptURL, lineNumber) { 
alert(errorMessage, scriptURL, lineNumber) 
}

甚至中提供了 Stack Trace,比如在 try/catch 中还提供了 e.stack(各个浏览器不同,可以使用 eriwen/javascript-stacktrace 这个兼容库),试一下下面这段代码:
try { 
fn() 
} catch(e) { 
alert(e.stack) 
}

所以收集这些错误还是比较方便的,这里需要注意的事,使用 window.addEventListener('error', callback, isBubble) 中 callback 的第一个参数并不是 event,而是一个 Error object。这样的话,为了方便,使用 window.onerror 是一个不错的选择,但通过 dot 操作符监听的事件是可以重载的,并且这段监听脚本理论上是放在所有 js 最前面的,所以需要考虑其中的风险。

二、使用
之前在支付宝的时候,线上 js 报错会变成一个邮件,发给前端开发 team,每个人自己认领、解决。其实这是一个不错的选择,也解决了最基本的问题:立即响应,修掉。不过也存在着一个问题,如果避免同样的错误?我的初步想法是这样的: 以 URL 为单元,记录同一个页面的报错:方便统一解决 记录错误包括:Page URL, User Agent, Script URL, Error Message 和 Line Number 每个错误解决后,都可以在一个地方写解决方案,看到的人可以评论、加分,最终会存档起来,作为一个知识库,并用有方便的 api 可以使用这些知识库的内容 在开发的时候,相同页面 window.onerror 的时候,通过插件,分析 Error Message 识别出类型,加上 URL 的判断,给予开发者提醒前人犯过的错误 开发者可以订阅知识库上某些标签,自动接收邮件(当然也可以根据文件注释、mapping 等方式做更好的配对) 为什么这样做?主要是为了解决下面的一些问题: 形成知识库,开发者可以从中得到学习,特别是新人 工具保证效率的提升和避免重复错误重复解决 订阅保证通知更具针对性

三、注意点
1. 收集的时候使用 POST 发送 有时候 Error Message 可能会比较长,而浏览器的 URL 长度是有限制的,如果存的错误不多的话,可以考虑用 GET 发送,但通常来说 POST 可以把所有数据都发送到后台。 2. 何时发送数据 建议在触发 onerror 的时候发送。在第一次有这个想法的时候,尝试着在 onbeforeonload 的时候发送,但 POST 请求还没 open 就已经被浏览器中断了。 3. 存于数据库以哪个作为索引比较好? 通常来说以 URL 可能会比较适合多数网站。但像百姓网、淘宝等 UGC 比较多的网站,可能需要变通一下以记录 URL。毕竟不同帖子不同 URL 都是同一套代码。 那以 Error 作为索引呢?其实无论是那种,看自己需求选择吧。 4. 是否记录所有错误 这个也比较合适根据需求来看。百姓网有各种乱七八糟的报错可能都是来自到 baidu / Google 的 ad 外链。

四、结语
目前初步实现了一个收集的工具(sofish/stacktrace.js)和存储方式,是否继续,还需要时间和进一步考虑,先发出来,抛砖引玉。

Javascript 相关文章推荐
JS操作Cookies包括(读取添加与删除)
Dec 26 Javascript
bootstrap布局中input输入框右侧图标点击功能
May 16 Javascript
JS实现侧边栏鼠标经过弹出框+缓冲效果
Mar 29 Javascript
Vue.js自定义事件的表单输入组件方法
Mar 08 Javascript
angularjs通过过滤器返回超链接的方法
Oct 26 Javascript
微信小程序之onLaunch与onload异步问题详解
Mar 28 Javascript
js仿360开机效果
Dec 26 Javascript
Node.js Domain 模块实例详解
Mar 18 Javascript
在vue项目中利用popstate处理页面返回的操作介绍
Aug 06 Javascript
Vuejs通过拖动改变元素宽度实现自适应
Sep 02 Javascript
Node 使用express-http-proxy 做api网关的实现
Oct 15 Javascript
JS实现简易日历效果
Jan 25 Javascript
JQuery 中几个类选择器的简单使用介绍
Mar 14 #Javascript
document.createElement()用法及注意事项(ff下不兼容)
Mar 13 #Javascript
document.createElement()用法
Mar 13 #Javascript
js获得鼠标的坐标值的方法
Mar 13 #Javascript
JavaScript将Table导出到Excel实现思路及代码
Mar 13 #Javascript
九种js弹出对话框的方法总结
Mar 12 #Javascript
瀑布流布局并自动加载实现代码
Mar 12 #Javascript
You might like
PHP的分页功能
2007/03/21 PHP
PHP求小于1000的所有水仙花数的代码
2012/01/10 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
整理php防注入和XSS攻击通用过滤
2015/09/13 PHP
浅析Yii2缓存的使用
2016/05/10 PHP
JS实现打开本地文件或文件夹
2021/03/09 Javascript
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
JScript中使用ADODB.Stream判断文件编码的代码
2008/06/09 Javascript
Extjs入门之动态加载树代码
2010/04/09 Javascript
jquery库或JS文件在eclipse下报错问题解决方法
2014/04/17 Javascript
火狐和ie下获取javascript 获取event的方法(推荐)
2016/11/26 Javascript
使用Angular缓存父页面数据的方法
2017/01/03 Javascript
JS获取多维数组中相同键的值实现方法示例
2017/01/06 Javascript
javascript常用经典算法详解
2017/01/11 Javascript
Angular 2 利用Router事件和Title实现动态页面标题的方法
2017/08/23 Javascript
JS实现为动态创建的元素添加事件操作示例
2018/03/17 Javascript
jquery层次选择器的介绍
2019/01/18 jQuery
layui使用label标签的方法
2019/09/14 Javascript
[01:24:51]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第二场
2014/05/26 DOTA
[04:20]DOTA2-DPC中国联赛 正赛 VG vs LBZS 选手采访 1月19日
2021/03/11 DOTA
使用python删除nginx缓存文件示例(python文件操作)
2014/03/26 Python
python抓取最新博客内容并生成Rss
2015/05/17 Python
python 获取网页编码方式实现代码
2017/03/11 Python
python图像常规操作
2017/11/11 Python
Python实现自动打开电脑应用的示例代码
2020/04/17 Python
Python3通过chmod修改目录或文件权限的方法示例
2020/06/08 Python
纯css3实现宠物小鸡实例代码
2018/10/08 HTML / CSS
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
Saucony澳大利亚官网:美国跑鞋品牌,运动鞋中的劳斯莱斯
2018/05/05 全球购物
化学教学随笔感言
2014/02/19 职场文书
会计岗位职责模板
2014/03/12 职场文书
法院授权委托书范文
2014/08/02 职场文书
投标授权委托书范文
2014/08/02 职场文书
感恩教师节演讲稿
2014/09/03 职场文书
企业培训简报范文
2015/07/20 职场文书