第 17 章 错误处理和调试

73 阅读4分钟

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 给出的最有价值的错误消息了。