js高程读书笔记 第17章 错误处理与调试
[TOC]
本章内容
- 理解浏览器报告的错误
- 处理错误
- 调试JavaScript代码
错误处理
try-catch语句
catch块会接收到一个而包含错误信息的对象,即使不想使用这个错误对象,也要给它起名字。这个对象中包含的实际信息会因浏览器而异,共同点是有一个保存着错误消息的message属性。1
2
3
4
5try{
//可能会导致错误的代码
} catch(error) {
//在错误发生时怎么处理
}
ECMA-262规定了这个错误类型的name属性。
1 | try{ |
finally子句
finally子句一经使用,其代码无论如何都会执行。错误类型
- Error
- EvalError
- RangeError
- ReferenceError
- SyntaxError
- TypeError
- URIError
抛出错误
throw操作符,用于随时抛出自定义错误。
在遇到throw操作符时,代码会立即停止执行。仅当有try-catch语句捕获到被抛出的值时,代码才会继续执行。
在创建自定义错误消息时最常用的错误类型是Error、RangeEroor、ReferenceError和TypeError。
此时,需要为新创建的错误类型指定name和message属性。1
2
3
4
5
6
7
8
9function CustomError(message){
this.name = "CustomError";
this.message = message;
}
CustomError.prototype = new Error();
throw new CustomError("My message");
错误事件
任何没有通过try-catch处理的错误都会出发window对象的error事件。onerror事件处理程序可以接受三个参数:错误消息、错误所在的URL和行号。
图像也支持error事件。只要图像的src特性中的URL不能返回可以被识别的图像格式,就会触发error事件。
1 | var image= new Image(); |
常见的错误类型
- 类型转换错误
- 数据类型错误
- 通信错误
关于数据类型错误,大体上来说,基本类型的值应该使用typeof来洁厕,而对象的值应该使用instanceof来检测。
通信错误一般会出现在Ajax编程中,URL通信调用encodeURIComponent()对象对数据进行编码。
区分致命错误和非致命错误
对于致命错误,例如1
2
3
4
5
6
7
8
9
10
11for (var i = 0, len = mods.length; i < len; i++){
mods[i].init();//可能会导致致命错误
}
//下列代码可以将所有模块的错误编程非致命的
for (var i = 0, len = mods.length; i < len; i++){
try {
mods[i].init();
} catch(e) {
//在这处理错误
}
}
把错误记录到服务器
1 | function logError(sev, msg){ |
这里使用了Image对象来发送请求,这样做非常灵活
- 所有浏览器都支持Image对象,包括哪些不支持XMLHttpRequest对象的浏览器。
- 可以避免跨域限制。
- 在记录错误的过程中出问题的概率比较低。
1 | for(var i = 0, len = mods.length; i < len ; i++) { |
调试技术
将消息记录到控制台
通过console对象向JavaScript控制台写入信息。
- error
- info
- log
- warn
将消息记录到当前页面
1 | function log(message){ |
抛出错误
1 | function assert(condition, message) { |
常见的IE错误
操作终止 operation aborted
未知运行时错误
span标签不能包含div之类的块级元素
小结
- 在可能发生错误的地方使用try-catch语句,这样有机会以适当的方式对错误给出响应。
- 使用window.onerror事件处理程序,这种方式可以接受try-catch不能处理的所有错误