处理 JS 异常的一个想法

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

一、收集

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

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

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

1 try {
2   fn()
3 } catch(e) {
4   alert(e.stack)
5 }

所以收集这些错误还是比较方便的,这里需要注意的事,使用 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)和存储方式(以 URL 为索引),是否继续,还需要时间和进一步考虑,先发出来,抛砖引玉。

五、附录
 1 <?php
 2
 3 $url = new Url();
 4 $page = $url->post('page');
 5
 6 if(!$page) return;
 7
 8 class ErrorTrace extends MongoData {
 9
10     // MongoData 中没有,区别 http://stackoverflow.com/a/7958954
11     public function findOne($obj) {
12         return $this->connection->findOne($obj);
13     }
14 };
15
16 $store = new ErrorTrace();
17 $fields = array(
18   'url' => $url->post('url'),
19     'message' => $url->post('message'),
20     'line' => $url->post('line'),
21     'ua' => $url->post('ua'),
22 );
23
24 $index = array('page' => $page);
25 $hash = md5(json_encode($fields));
26
27 // 不重复记录一个错误,所有错误记录在同一个 URL 下
28 if($field = $store->findOne($index)) {
29     if(isset($field[$hash])) return;
30     return $store->setAttr(new Query('page', $page), $hash, $fields);
31 }
32
33 $store->page = $page;
34 $store->$hash = $fields;
35 $store->save();
36
37 ?>

转载自:http://sofish.de/2144,

Lionden 2013年3月22日

E-mail:hsdlionden@gmail.com

转载请注明原文地址和博客园Lionden:http://www.cnblogs.com/lionden/

转载于:https://www.cnblogs.com/lionden/archive/2013/03/22/2975285.html

处理JS异常的一个想法相关推荐

  1. JS 异常: Uncaught RangeError: Maximum call stack size exceeded

    遇到了这个js异常, 总是吧浏览器搞崩溃,这是什么原因呢? 开始我也只能想到死循环, 也许是哪个条件判断写错了,其实不是.经过google,发现了一篇文章,内容请看: ================ ...

  2. 用JS写了一个模拟串行加法器

    在重温<编码:隐匿在计算机软硬件背后的语言>第12章--二进制加法器时,心血来潮用JS写了一个模拟串行加法器. 测试断言工具TestUtils.js function assertTrue ...

  3. Node.js异常捕获处理

    文章目录 Node.js异常特点 异常的捕获处理 同步异常 异步异常 callback event Promise Async/Await uncaughtException异常 Node.js异常特 ...

  4. Nexus.js介绍:一个多线程的JavaScript运行库

    首先,如果你不熟悉这个项目,建议先阅读之前写的一系列文章.如果你不想阅读这些,不用担心.这里面也会涉及到那些内容. 现在,让我们开始吧. 去年,我开始实现Nexus.js,这是一个基于Webkit/J ...

  5. 一个想法--开发与业务,我们互相依赖

    一个想法--开发与业务,我们互相依赖 编程之道很多人都读了,这位大师真是会利用中国阴阳学,但是中心思想就是工具就是工具,不是思想,经常听人们说,think in 什么,也是,如果单抱着什么编程实例也没 ...

  6. web静态资源访问规则||webjars的访问配置——webjars是maven库里面对css js image打的一个jar包

    Html css js image  txt   web项目中 放在 Webapp 在springboot项目中  静态资源放置的位置 Springboot默认的静态资源目录 (1)在src/main ...

  7. go html vue,用Go+Vue.js快速搭建一个Web应用(初级demo)

    Vue.js做为目前前端最热门的库之一,为快速构建并开发前端项目多了一种思维模式.本文给大家介绍用Go+Vue.js快速搭建一个Web应用(初级demo). 环境准备: 1. 安装go语言,配置go开 ...

  8. MOBA项目定点数的一个想法

    MOBA项目定点数的一个想法 能不能这样: 写逻辑时全用整数,不用每用到一个浮点数就要转一下成浮点数. 主要是除法 题细节较多,待思考 posted on 2018-11-04 19:58 时空观察者 ...

  9. 关于U3D场景烘焙的一个想法

    关于U3D场景烘焙的一个想法 U3D进行场景烘焙时,发现阴影无法选择烘焙质量,其实想一下也合理,毕竟是烘焙,是将光照与阴影信息保存到lightmap中,因此阴影的质量取决于光照贴图的精度, 就算光照贴 ...

最新文章

  1. http账户密码的截取
  2. ORA-00257: archiver error. Connect internal only, until freed
  3. 华为手表用鸿蒙了吗,华为鸿蒙都2.0了,手机还不能用吗?
  4. 1 python基础
  5. Spring MVC的web.xml配置详解(转)
  6. HTML/CSS/动画
  7. CRISPR基因编辑
  8. 52)PHP,加了单例模式的数据库代码
  9. 在VM安装最新版Linux镜像
  10. 如何降低疾病监测的漏诊比率?一种新的分类学习算法
  11. java一个整数加100是完全平方_Java计算一个数加上100是完全平方数,加上168还是完全平方数...
  12. Generality
  13. ps 制作虚线框背景
  14. VS2015使用opencv
  15. 子网掩码与prefixLength长度的互相转换
  16. 嵌入式开发——brctl命令实现桥接上网
  17. VisionPro和Halcon 的详细对比
  18. 关于branch XYZ is published (but not merged) and is now N commits behind错误的解决方法
  19. 微信页面在浏览器打开
  20. 教育+直播APP系统开发方案

热门文章

  1. php的session怎么用,php $_session怎么用
  2. android蓝牙固件升级_AirPods Pro 如何升级固件开启「空间音频」?为何「空间音频」未生效?如何体验「空间音频」?...
  3. java中如何关闭文件,在Java中捕获IOException后如何关闭文件?
  4. 微信windows版_刚刚微信内测更新!可以批量管理好友,太方便了
  5. springboot 实现策略模式
  6. kafka生产者和消费者端的数据不一致
  7. 数据科学家提高效率的 40 个 Python 技巧
  8. 爱了!爱了!Markdown 必备组合神器!
  9. 肝!不需要一行 Python 代码,也可以自动获取数据
  10. matlab hsi图像分割,提取图像的HSI图像分量