8.2 处理异常

JavaScript语言处理异常通常有两种方式:一种方式是使用onerror事件,该事件可以在window对象或图像对象上触发;另一种方式是使用try...catch...finally模型。本节将分别描述这两种处理异常的方式。

8.2.1 异常类型

一个程序通常会出现3种类型的异常,分别为“语法异常”“运行时的异常”和“逻辑异常”。其中,“语法异常”通常在程序员输入一些编译器无法识别的代码后发生;“运行时的异常”通常在运行过程中碰到某个错误时发生,与“语法异常”的区别在于它不一定是JavaScript语言的错误引发的异常;“逻辑异常”往往发生在程序设计时,即程序没有按照预先设计的方式运行。

8.2.2 触发onerror事件处理异常

触发onerror事件是最早用于处理JavaScript异常的机制。页面出现异常时,将触发onerror事件,该事件在window对象上触发。

语法格式:

参数说明:

window.onerror:触发onerror事件。

说明

如果在onerror事件处理函数中没有使用“return true;”语句,在弹出错误提示对话框后,浏览器的错误报告也会显示出来。为了隐藏此错误报告,函数需要返回true。

除了window对象可以触发onerror事件之外,图像对象也可以触发onerror事件。

语法格式:

    <script language="javascript">
    document.images[0].onerror=function(){
        somestatements;
        return true;
    }
    </script>

参数说明:

document.images[0]:页面中的第一个图像。

使用onerror事件,除了可以捕捉异常之外,还可以提供如下3种有助于确定异常情况的详细信息。

异常信息:获取异常信息。

URL:获取发生异常的文件的绝对路径。

行号:给定发生异常文件的行号。

语法格式:

参数说明:

window.onerror:window对象触发onerror事件。

【例8.1】 使用onerror事件处理异常。(实例位置:资源包\TM\sl\8\01)

本实例使用onerror事件处理在window对象和图像对象中的异常情况,并以提示框的形式显示异常信息。运行结果如图8.3和图8.4所示。

图8.3 window对象使用onerror事件处理异常

图8.4 图像对象使用onerror事件处理异常

代码如下:

上述HTML文件中,<body>区域调用了页面中未定义的函数onHave(),所以执行此页面将会发出异常,会弹出“您调用的函数不存在”错误提示对话框,同时显示此异常的相关详细信息,包括错误信息、发生异常文件的绝对路径以及在程序中发生异常的行号。

在页面中定义了一个图像,由于此时没有赋给此图像src属性,因此在onerror事件处理函数中赋给第一个图像src值将会出现异常,程序将弹出错误提示对话框。

8.2.3 使用try...catch…finally语句处理异常

JavaScript从Java语言中引入了try...catch...finally功能。

语法格式:

参数说明:

try:检测异常关键字。

catch:捕捉异常关键字。

finally:最终被处理的区块关键字。

说明

JavaScript语言与Java语言不同,try...catch…finally语句中只能有一个catch语句。这是由于在JavaScript语言中无法指定出现异常的类型。

【例8.2】 使用try...catch...finally语句处理异常。(实例位置:资源包\TM\sl\8\02)

本实例使用try...catch...finally语句处理异常,当在程序中调用不存在的对象时,将弹出在catch区域中设置的异常提示信息,并且最终弹出finally区域中的信息提示。运行结果如图8.5和图8.6所示。

图8.5 弹出异常提示对话框(1)

图8.6 弹出异常提示对话框(2)

代码如下:

由于页面中并没有定义表单以及文本框,因此在try区域中调用表单文本框的长度时,将发生异常,这时将执行catch区域中的语句,弹出相应异常提示信息的对话框。

1.嵌套try...catch语句

如果在catch区域中也发生了异常,可以在catch区域中再使用一组try...catch语句,即嵌套使用try...catch语句。

语法格式:

参数说明:

try:检测异常关键字。

catch:捕捉异常关键字。

finally:最终被处理的区块关键字。

【例8.3】 使用嵌套try...catch语句处理异常。(实例位置:资源包\TM\sl\8\03)

本实例主要实现嵌套try...catch语句处理异常。在外部try区域中调用不存在的对象时,将弹出外部catch区域内设置的异常提示信息的对话框;在catch区域中调用不存在的对象时,也会产生异常,这时将弹出嵌套catch区域内设置的异常提示信息的对话框及finally区域设置的异常提示信息对话框。运行结果如图8.7~图8.9所示。

图8.7 弹出异常提示对话框(1)

图8.8 弹出异常提示对话框(2)

图8.9 弹出异常提示对话框(3)

代码如下:

在该实例中,抛出第一个异常后,将弹出“try区域运行时有异常发生”提示信息对话框。继续执行外部catch区域的语句,程序尝试调用页面中并不存在的对象,将发生异常,此时弹出“catch区域运行时有异常发生”提示信息对话框。最后执行finally区域的语句,弹出相应对话框。

2.Error对象

try...catch...finally语句中,catch捕捉到的对象通常为Error对象。Error类是所有用于抛出异常的类的基类,类似于Java语言中用于抛出异常的基类Exception。JavaScript中用于抛出异常的类如表8.1所示。

表8.1 JavaScript中用于抛出异常的类

Error对象有以下两个属性。

name:表示异常类型的字符串。

message:实际的异常信息。

【例8.4】 验证Error对象的属性。(实例位置:资源包\TM\sl\8\04)

本实例将异常提示信息放置在弹出的提示对话框中,其中包括异常的具体信息以及异常类型的字符串。运行结果如图8.10所示。

图8.10 异常信息提示对话框

代码如下:

3.使用throw语句抛出异常

在程序中使用throw语句,可以有目的地抛出异常。

语法格式:

    <script language="javascript">
    throw new Error("somestatements");
    </script>

参数说明:

throw:抛出异常关键字。

也可以使用throw语句抛出Error对象子类的对象。

语法格式:

    <script language="javascript">
    throw new TypeError("somestatements");
    </script>

【例8.5】 使用throw语句抛出异常。(实例位置:资源包\TM\sl\8\05)

本实例使用throw语句抛出程序中的异常。在代码中首先定义一个变量,赋给的值为1与0的商,此变量的结果为无穷大,即Infinity。如果希望自行检验除零异常,可以使用throw语句抛出异常。运行结果如图8.11所示。

图8.11 使用throw语句抛出异常

代码如下:

读者从程序中可以看出,当变量num为无穷大时,使用throw语句抛出异常。此异常在catch区域被捕捉,并将异常提示信息放置在弹出的错误提示对话框中。