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

可能由于网络、浏览器问题、缓存等原因,可能导致线上执行 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)和存储方式,是否继续,还需要时间和进一步考虑,先发出来,抛砖引玉。

时间: 2024-11-01 22:48:22

JS异常处理的一个想法(sofish)_javascript技巧的相关文章

如何判断出一个js对象是否一个dom对象_javascript技巧

我们在写js代码时有时需要判断某个对象是不是DOM对象,然后再进行后续的操作,这里我给出一种兼容各大浏览器,同时又算是比较稳妥的一种方法. 要判断一个对象是否DOM对象,首先想到的无非就是它是否具有DOM对象的各种属性或特征,比如是否有nodeType属性,有tagName属性,等等.判断的特征越多,也就越可靠,因为毕竟我们自定义的js对象也可以有那些属性.还有其他方法吗? 在DOM Level2标准中定义了一个HTMLElement对象,它规定所有的DOM对象都是HTMLElement的实例,

用JS实现的一个include函数_javascript技巧

很多语言都有类似php中的include和require功能的函数,而唯独javascript没有.  很早就想在js中实现类似的功能,尝试了很多次都没有成功,那天在google上搜索一些关于动态加载css文件的关键词时,发现一个blog(地址找不到了)上的一个为网页的head标签增加link元素的函数,于是就改了一下,写了这个函数.  用法:  include_js(src,[reload]);  src: js文件的路径名  reload:可选参数,0或1,表示是否重复加载同一个url的js

跟我学Nodejs(一)--- Node.js简介及安装开发环境_javascript技巧

学习资料 1.深入浅出Node.js 2.Node.js开发指南 简介(只捡了我觉得重要的)     Node.js是让Javascript脱离浏览器运行在服务器的一个平台,不是语言:     Node.js采用的Javascript引擎是来自Google Chrome的V8:运行在浏览器外不用考虑头疼的Javascript兼容性问题     采用单线程.异步IO与事件驱动的设计来实现高并发(异步事件也在一定程度上增加了开发和调试的难度):     Node.js内建一个HTTP服务器,所以对于

vue.js入门教程之计算属性_javascript技巧

前言 计算属性是用来声明式的描述一个值依赖了其它的值.当你在模板里把数据绑定到一个计算属性上时,Vue 会在其依赖的任何值导致该计算属性改变时更新 DOM.这个功能非常强大,它可以让你的代码更加声明式.数据驱动并且易于维护. 模板中表达式非常便利,但是它们实际上只用于简单的操作. 模板是为了描述视图的结构,在模板中放入太多的逻辑会让模板过重且难以维护. 这就是为什么 Vue.js 将绑定表达式限制为一个表达式, 如果需要多于一个表达式的逻辑,应当使用计算属性. 来看这一个简单的例子 <div i

Vue.JS入门教程之列表渲染_javascript技巧

你可以使用 v-repeat 指令来基于 ViewModel 上的对象数组渲染列表.对于数组中的每个对象,该指令将创建一个以该对象作为其 $data 对象的子 Vue 实例.这些子实例继承父实例的数据作用域,因此在重复的模板元素中你既可以访问子实例的属性,也可以访问父实例的属性.此外,你还可以通过 $index 属性来获取当前实例对应的数组索引. <ul id="demo"> <li v-repeat="items" class="ite

Vue.js 父子组件通讯开发实例_javascript技巧

vue.js,是一个构建数据驱动的 web 界面的库.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.(这是官方的一个解释!) 小编没使用过angularjs,也没使用过react.js,不能详细的说明三者的区别,想了解的话,在官方有一个分析,请点这里查看 小编从业前端开发也有了一年多的时间,刚开始的时候,前端开发展现的技术太多,小编有心无力,兼顾不过来,经过了解之后,还是选择了学原生js基础兼并jquery的学习上路.小编使用vue.js,也是因为业务的需求

JS面向对象编程之对象使用分析_javascript技巧

因为大家总是用面向过程的编程思想来写JS代码,而且也由于网络上充斥了太多小"巧"的JS代码段,很多都是随意而为,很不规范,这也就造成了大家对JS的"误解",一味的认为它就是一个辅助的小东东,而不适合做大的东西开发.但是自从AJAX兴起后,大量的JS代码编写要求人们具备像写JAVA类似的代码一样,能够面向对象进行开发. 所以下面就结合我自己的体会和所学习的东东和大家一起来学习在JS中如何使用面向对象的编程.其实使用JS进行面向对象开发也不是很难的事情,因为在JS中每一

js内置对象 学习笔记_javascript技巧

mark相关的知识点: 首先,什么是js的内置对象,它包括了些什么内容?(以下内容转自网上资源的整合) (W3shool JS手册地址:http://www.jb51.net/w3school/js/js_reference.htm) 作为一门编程语言,JavaScript提供了一些内置的对象和函数.内置对象提供编程的几种最常用的功能.JavaScript内置对象有以下几种. ● String对象:处理所有的字符串操作 ● Math对象:处理所有的数学运算 ● Date对象:处理日期和时间的存储

vue.js中$watch的用法示例_javascript技巧

前言 vue.js是一个数据驱动的web界面库.Vue.js只聚焦于视图层,可以很容易的和其他库整合.代码压缩后只有24kb Vue.js 提供了一个方法 watch,它用于观察Vue实例上的数据变动.对应一个对象,键是观察表达式,值是对应回调.值也可以是方法名,或者是对象,包含选项. 在实例化时为每个键调用 $watch() ; <template> //观察数据为字符串或数组 <input v-model="example0"/> <input v-m