错误类型

  1. 即时运行错误 (代码错误)

  2. 资源加载错误

常见的错误

1. 类型转换错误

建议使用全等===操作符

2.数据类型错误

建议加强类型判断

// 数组倒序
function reverseSort(value) {
if (value instanceof Array) {
// 使用instanceof验证数据类型
// (基础类型用typeof, 引用类型用instanceof)
value.sort();
value.revere()
}
}
3. 通信错误

url参数编码错误造成,建议使用encodeURIComponent()对url参数数据进行编码

// 错误的url参数
// http://www.xxx.com/?redir=http://www.xxx.com?a=b&c=d // 针对redir后面的参数字符串进行编码 // 封装一个处理方法(摘自书中代码)
function addQueryStringArg(url, name, value) {
if (url.indexOf('?') < 0) {
url += '?';
} else {
url += '&';
}
url += encodeURIComponent(name) + "=" + encodeURIComponent(value);
return url;
}

错误的捕获方式

针对即时运行错误
  1. try-catch(代码可疑区域可增加try-catch

  2. window.onerror (全局监控js错误异常)

1. try-catch
try {
// 可能会导致错误的代码
} catch (error) {
// 错误发生时处理
console.log(error.message);
} finally {
// 一定会执行(无论是否发生错误)
}

TIPS: 使用了finallytrycatchreturn语句都会被忽略

function testFinally() {
try {
return 2;
} catch (error) {
return 1;
} finally {
return 0;
}
} // testFinally 最终返回 0

TIPS: try-catch只能捕获同步运行的代码错误,无法检测语法和异步错误

(语法可借助ESlint工具在开发阶段提示解决)

2. window.onerror

遵循DOM0级事件,window.onerror事件处理程序不会创建event对象,但可以接收三个参数message(错误信息), url(错误文件url), line(行号)

window.onerror = function(message, url, line){
console.log(message, ulr, line);
};

在事件处理程序中返回false,可以阻止浏览器报告错误的默认行为

window.onerror = function(message, url, line) {
return false;
}
针对资源加载错误
  1. object.onerror

  2. performance.getEntries()

  3. Error事件捕获 (全局监控静态资源异常)

1. object.onerror

如script,image等标签src引用,会返回一个event对象

TIPS: object.onerror不会冒泡到window对象,所以window.onerror无法监控资源加载错误

var img = new Image();
img.src = 'http://xxx.com/xxx.jpg';
img.onerror = function(event) {
console.log(event);
}

2. window.performance.getEntires()

适用高版本浏览器,返回已成功加载的资源列表,然后自行做比对差集运算,核实哪些文件没有加载成功

var result = [];
window.performance.getEntries().forEach(function (perf) {
result.push({
'url': perf.name,
'entryType': perf.entryType,
'type': perf.initiatorType,
'duration(ms)': perf.duration
});
});
console.log(result);

3. Error事件捕获
window.addEventListener('error', function(error){
//...(全局监控静态资源异常)
console.log(error);
}, true); // 默认false为冒泡阶段触发,true为捕获阶段触发

跨域的js错误捕获

一般涉及跨域的js运行错误时会抛出错误提示script error,但没有具体信息(如出错文件,行列号提示等), 可利用资源共享策略来捕获跨域js错误

  1. 客户端:在script标签增加crossorigin属性(客户端)

  2. 服务端:js资源响应头Access-Control-Allow-Origin: *

错误上报

  1. Ajax请求 (会有跨域问题)

  2. 动态创建Image标签 (兼容完美,代码简洁,需要注意浏览器url长度限制)

Image标签
(new Image()).src= 'http://xxx.com/error?code=1002'
上报频率

错误信息频繁发送上报请求,会对后端服务器造成压力。

项目中我们可通过设置采集率,或对规定时间内数据汇总再上报,减少请求数量,从而缓解服务端压力。

// 借鉴别人的一个例子
Reporter.send=function(data) {
// 只采集30%
if(Math.random() < 0.3) {
send(data); // 上报错误
}
}

参考文档

作者:以乐之名本文原创,有不当的地方欢迎指出。转载请指明出处。

读书笔记(04) - 错误监控 - JavaScript高级程序设计的更多相关文章

  1. 读书笔记(06) - 语法基础 - JavaScript高级程序设计

    写在开头 本篇是小红书笔记的第六篇,也许你会奇怪第六篇笔记才写语法基础,笔者是不是穿越了. 答案当然是没有,笔者在此分享自己的阅读心得,不少人翻书都是从头开始,结果永远就只在前几章. 对此,笔者换了随 ...

  2. 【读书笔记】读《JavaScript高级程序设计-第2版》 - 非函数部分

    章节列表: 第08章:BOM 第09章:客户端检测 第10章:DOM 第11章:DOM2和DOM3 第12章:事件 第13章:表单脚本 第14章:错误处理与调试 第17章:Ajax和JSON第20章: ...

  3. 【读书笔记】读《JavaScript高级程序设计-第2版》 - 函数部分

    1. 定义 函数实际上是对象,每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定. 对于函数 ...

  4. 《JavaScript高级程序设计》学习笔记12篇

    写在前面: 这12篇博文不是给人看的,而是用来查的,忘记了什么基础知识,点开页面Ctrl + F关键字就好了 P.S.如果在对应分类里没有找到,麻烦告诉我,以便尽快添上.当然,我也会时不时地添点遗漏的 ...

  5. 《JavaScript高级程序设计》读书笔记--前言

    起因 web编程过程使用javascript时感觉很吃力,效率很低.根本原因在于对javascript整个知识体系不熟,看来需要找些书脑补一下,同时欢迎众网友监督. 大神推荐书籍 看了博客大神们推荐的 ...

  6. 《Javascript高级程序设计》读书笔记之对象创建

    <javascript高级程序设计>读过有两遍了,有些重要内容总是会忘记,写一下读书笔记备忘 创建对象 工厂模式 工厂模式优点:有了封装的概念,解决了创建多个相似对象的问题 缺点:没有解决 ...

  7. JavaScript高级程序设计(读书笔记)(一)

    本笔记汇总了作者认为“JavaScript高级程序设计”这本书的前七章知识重点,仅供参考. 第一章 JavaScript简介 JavaScript发展简史: 1995年,JavaScript诞生 19 ...

  8. 读书笔记(02) - 可维护性 - JavaScript高级程序设计

    编写可维护性代码 可维护的代码遵循原则: 可理解性 (方便他人理解) 直观性 (一眼明了) 可适应性 (数据变化无需重写方法) 可扩展性 (应对未来需求扩展,要求较高) 可调试性 (错误处理方便定位) ...

  9. (读书笔记)函数参数浅析-JavaScript高级程序设计(第3版)

    ECMAScript函数不介意传递的参数个数,因为在其内部是用一个数组进行表示的.在函数体内可以通过arguments对象来访问这个参数数组,就像我们正常访问数组一样处理. arguments对象只是 ...

随机推荐

  1. 如何使用vs进行代码比较

    当我们在进行团队合作开始项目时,有时候不仅自己要写代码还需要修改bug,当我们修改代码以后,为了保持代码库中代码的整洁美观和一直性,有些误操作,比如多一个或多个空格,多一行,少一行,格式对齐等,这样的 ...

  2. TreeSet集合为什么要实现Comparable?

    首先,让我们来看看JDK中TreeSet类的add方法 /** * Adds the specified element to this set if it is not already presen ...

  3. webService之helloword(java)

    webservice 远程数据交互技术 1.导入jar包(如果是 maven项目导入项目坐标) 2.创建服务 3.测试服务 我们使用maven来做测试服务 pom.xml文件 <project ...

  4. c需要注意的细节

    1.在纯的.c文件中,例如struct Stu,之后不可以只使用Stu作为关键字来表示这个定义的结构体类型,一定要使用struct Stu一起作为类似int这种关键字来定义或者获取size. 2.函数 ...

  5. 修改Android EditText光标颜色

    EditText有一个属性:android:textCursorDrawable,这个属性是用来控制光标颜色的   android:textCursorDrawable="@null&quo ...

  6. vscode 调试node.js

    在开发的过程中,几乎不可能一次性就能写出毫无破绽的程序,断点调试代码是一个普遍的需求. 作为前端开发工程师,以往我们开发的JavaScript程序都运行在浏览器端,利用Chrome提供的开发者工具就可 ...

  7. Mahout简介

    Mahout简介 一.mahout是什么 Apache Mahout是ApacheSoftware Foundation (ASF)旗下的一个开源项目,提供了一些经典的机器学习的算法,皆在帮助开发人员 ...

  8. maven工程聚合和继承的意义

    聚合的意义: 对于一个大型的项目,如果我们直接作为一个工程开发,由于相互之间的依赖我们只能从头到尾由一组人开发,否则就会出现一个类好多人开发,相互更改的混乱局面,这个时候我们就将项目进行了横向和纵向的 ...

  9. 查找对端mac地址

    1.ping对端mac: 2.arp命令查找:

  10. Strom开发配置手册

    一:Storm集群搭建 1.本次开发使用的是storm0.9.3 2.Storm0.9.3集群搭建: 1)storm集群角色包含集群主节点Nimbus:集群从节点Supervisor 2)集群安装:先 ...