17.1 浏览器报告的错误
通过打开浏览器的控制台,可以看到运行的错误。
17.2 错误处理
17.2.1 try-catch语句
ECMA-262 第 3 版引入了 try-catch 语句,作为 JavaScript 中处理异常的一种标准方式。
try{
// 可能会导致错误的代码
} catch(error){
// 在错误发生时怎么处理
}
finally 子句一经使用,其代码无论如何都会执行。
function testFinally(){
try {
return 2;
} catch (error){
return 1;
} finally {
return 0;
}
}
由于最后还有一个 finally 子句,结果就会导致上面的 return 语句被忽略;也就是说,调用这个函数只能返回 0。
ECMA-262 定义了下列 7 种错误类型:
- Error 基类型,其他错误类型都继承自该类型
- EvalError 使用 eval()函数而发生异常时被抛出
- RangeError 数值超出相应范围时触发
- ReferenceError 找不到对象时
- SyntaxError 语法错误
- TypeError 在执行特定于类型的操作时,变量的类型并不符合
- URIError 使用 encodeURI()或 decodeURI(),而 URI 格式不正确时
还有一个非标准错误类型 InternalError,表示 JavaScript 引擎内部的错误
17.2.2 抛出错误
与 try-catch 语句相配的还有一个 throw 操作符,用于随时抛出自定义错误。
throw 12345;
throw "Hello world!";
throw true;
throw { name: "JavaScript"};
在遇到 throw 操作符时,代码会立即停止执行。仅当有 try-catch 语句捕获到被抛出的值时,代码才会继续执行。
17.2.3 错误(error)事件
任何没有通过 try-catch 处理的错误都会触发 window 对象的 error 事件。
在任何 Web 浏览器中,onerror 事件处理程序都不会创建 event 对象,但它可以接收三个参数:错误消息、错误所在的 URL 和行号。
window.onerror = function(message, url, line){
alert(message);
};
只要发生错误,无论是不是浏览器生成的,都会触发 error 事件,并执行这个事件处理程序。
17.2.5 常见的错误类型
由于 JavaScript 是松散类型的,而且也不会验证函数的参数,因此错误只会在代码运行期间出现。一般来说,需要关注三种错误:
- 类型转换错误
- 数据类型错误
- 通信错误
17.2.6 区分致命错误和非致命错误
非致命错误
- 不影响用户的主要任务;
- 只影响页面的一部分;
- 可以恢复;
- 重复相同操作可以消除错误。
致命错误,可以通过以下一或多个条件来确定:
- 应用程序根本无法继续运行;
- 错误明显影响到了用户的主要操作;
- 会导致其他连带错误。
17.2.7 把错误记录到服务器
开发 Web 应用程序过程中的一种常见的做法,就是集中保存错误日志,以便查找重要错误的原因。
17.3 调试技术
17.3.1 将消息记录到控制台
通过 console 对象向 JavaScript 控制台中写入消息
- error(message):将错误消息记录到控制台
- info(message):将信息性消息记录到控制台
- log(message):将一般消息记录到控制台
- warn(message):将警告消息记录到控制台
17.3.2 将消息记录到当前页面
另一种输出调试消息的方式,就是在页面中开辟一小块区域,用以显示消息。这个区域通常是一个元素,而该元素可以总是出现在页面中,但仅用于调试目的;也可以是一个根据需要动态创建的元素。
17.3.3 抛出错误
抛出错误也是一种调试代码的好办法
17.4 常见的 IE 错误
IE 一直都是最难于调试 JavaScript 错误的浏览器
17.4.1 操作终止
在 IE8 之前的版本中,存在一个相对于其他浏览器而言,最令人迷惑、讨厌,也最难于调试的错误:操作终止(operation aborted)。在修改尚未加载完成的页面时,就会发生操作终止错误。发生错误时,会出现一个模态对话框,告诉你“操作终止。”单击确定(OK)按钮,则卸载整个页面,继而显示一张空白屏幕;此时要进行调试非常困难。
17.4.2 无效字符
在 JavaScript 文件中存在无效字符时,IE 会抛出无效字符(invalid character)错误。
17.4.3 未找到成员
IE 中的所有 DOM 对象都是以 COM 对象,而非原生 JavaScript 对象的形式实现的。这会导致一些与垃圾收集相关的非常奇怪的行为。IE 中的未找到成员(Member not found)错误,就是由于垃圾收集例程配合错误所直接导致的。
17.4.4 未知运行时错误
当使用 innerHTML 或 outerHTML 以下列方式指定 HTML 时,就会发生未知运行时错误(Unknownruntime error):一是把块元素插入到行内元素时,二是访问表格任意部分(<\table>、<\tbody>等)的 任意属性时。
17.4.5 语法错误
如果你引用了外部的 JavaScript 文件,而该文件最终并没有返回 JavaScript 代码,IE 也会抛出语法错误。
17.4.6 系统无法找到指定资源
系统无法找到指定资源(The system cannot locate the resource specified)这种说法,恐怕要算是 IE 给出的最有价值的错误消息了。