- JavaScript从入门到精通(第3版)
- 明日科技
- 2068字
- 2021-03-26 09:55:41
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区域被捕捉,并将异常提示信息放置在弹出的错误提示对话框中。