![JavaScript从入门到精通(第3版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/93/27738093/b_27738093.jpg)
8.2 处理异常
JavaScript语言处理异常通常有两种方式:一种方式是使用onerror事件,该事件可以在window对象或图像对象上触发;另一种方式是使用try...catch...finally模型。本节将分别描述这两种处理异常的方式。
8.2.1 异常类型
一个程序通常会出现3种类型的异常,分别为“语法异常”“运行时的异常”和“逻辑异常”。其中,“语法异常”通常在程序员输入一些编译器无法识别的代码后发生;“运行时的异常”通常在运行过程中碰到某个错误时发生,与“语法异常”的区别在于它不一定是JavaScript语言的错误引发的异常;“逻辑异常”往往发生在程序设计时,即程序没有按照预先设计的方式运行。
8.2.2 触发onerror事件处理异常
触发onerror事件是最早用于处理JavaScript异常的机制。页面出现异常时,将触发onerror事件,该事件在window对象上触发。
语法格式:
![](https://epubservercos.yuewen.com/23D367/15936052205027606/epubprivate/OEBPS/Images/Figure-P189_71700.jpg?sign=1739149932-3JY7z8opWwGHoSJc4d8Rtj6pDMltA4Kc-0-ec681fa79e20361bc641c865c5984408)
参数说明:
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:获取发生异常的文件的绝对路径。
行号:给定发生异常文件的行号。
语法格式:
![](https://epubservercos.yuewen.com/23D367/15936052205027606/epubprivate/OEBPS/Images/Figure-P190_71703.jpg?sign=1739149932-PIVqik2hSQGpwn2tJjFb3kwNxR9PYcDz-0-2bb729cda806c0eed6214205c3a5d0de)
参数说明:
window.onerror:window对象触发onerror事件。
【例8.1】 使用onerror事件处理异常。(实例位置:资源包\TM\sl\8\01)
本实例使用onerror事件处理在window对象和图像对象中的异常情况,并以提示框的形式显示异常信息。运行结果如图8.3和图8.4所示。
![](https://epubservercos.yuewen.com/23D367/15936052205027606/epubprivate/OEBPS/Images/Figure-P190_24598.jpg?sign=1739149932-87l8E9FpLA2OU4aGWEt7EktZBaQMB5sM-0-a67ab92bccd15d6150f91256ce05d4b2)
图8.3 window对象使用onerror事件处理异常
![](https://epubservercos.yuewen.com/23D367/15936052205027606/epubprivate/OEBPS/Images/Figure-P190_24599.jpg?sign=1739149932-XpwAEsOpdEQV7Y9O29tvU5SAlEDKE6f8-0-0ba1b92ae5c8178a3b06f97da64327f7)
图8.4 图像对象使用onerror事件处理异常
代码如下:
![](https://epubservercos.yuewen.com/23D367/15936052205027606/epubprivate/OEBPS/Images/Figure-P190_71704.jpg?sign=1739149932-VqQdXtK3FDws38FofWRWTRjlILA1WLvY-0-502aaad279bd78b6c3d538fc1f724c17)
上述HTML文件中,<body>区域调用了页面中未定义的函数onHave(),所以执行此页面将会发出异常,会弹出“您调用的函数不存在”错误提示对话框,同时显示此异常的相关详细信息,包括错误信息、发生异常文件的绝对路径以及在程序中发生异常的行号。
在页面中定义了一个图像,由于此时没有赋给此图像src属性,因此在onerror事件处理函数中赋给第一个图像src值将会出现异常,程序将弹出错误提示对话框。
8.2.3 使用try...catch…finally语句处理异常
JavaScript从Java语言中引入了try...catch...finally功能。
语法格式:
![](https://epubservercos.yuewen.com/23D367/15936052205027606/epubprivate/OEBPS/Images/Figure-P191_71706.jpg?sign=1739149932-cK17MPdc7EF9KOyTW0g7qarH3KjDcXCV-0-d53130f78f4dbd68fa7fb364d9d9812a)
参数说明:
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所示。
![](https://epubservercos.yuewen.com/23D367/15936052205027606/epubprivate/OEBPS/Images/Figure-P192_24830.jpg?sign=1739149932-Bg7vlpYtr5SDInjVFVfsoHwUSaMMoOnU-0-94a57ef0f1cf8f35fe7da053f5ce6647)
图8.5 弹出异常提示对话框(1)
![](https://epubservercos.yuewen.com/23D367/15936052205027606/epubprivate/OEBPS/Images/Figure-P192_24831.jpg?sign=1739149932-haK7Z9UClYHQMUBFCyrnwOyjiH7XCXNc-0-da6be2213c256df4bae0b1396cc16cdf)
图8.6 弹出异常提示对话框(2)
代码如下:
![](https://epubservercos.yuewen.com/23D367/15936052205027606/epubprivate/OEBPS/Images/Figure-P192_71707.jpg?sign=1739149932-2N7khOYDXpTG9O384Jc35qvTrddLWzYV-0-c01fcbf289d59aea5dad63347e7132ea)
由于页面中并没有定义表单以及文本框,因此在try区域中调用表单文本框的长度时,将发生异常,这时将执行catch区域中的语句,弹出相应异常提示信息的对话框。
1.嵌套try...catch语句
如果在catch区域中也发生了异常,可以在catch区域中再使用一组try...catch语句,即嵌套使用try...catch语句。
语法格式:
![](https://epubservercos.yuewen.com/23D367/15936052205027606/epubprivate/OEBPS/Images/Figure-P192_71708.jpg?sign=1739149932-RLynRwVFmnEVkIXiootSoj30YTc64WVl-0-173f2ab2616858650bec9d13b7096ab4)
参数说明:
try:检测异常关键字。
catch:捕捉异常关键字。
finally:最终被处理的区块关键字。
【例8.3】 使用嵌套try...catch语句处理异常。(实例位置:资源包\TM\sl\8\03)
本实例主要实现嵌套try...catch语句处理异常。在外部try区域中调用不存在的对象时,将弹出外部catch区域内设置的异常提示信息的对话框;在catch区域中调用不存在的对象时,也会产生异常,这时将弹出嵌套catch区域内设置的异常提示信息的对话框及finally区域设置的异常提示信息对话框。运行结果如图8.7~图8.9所示。
![](https://epubservercos.yuewen.com/23D367/15936052205027606/epubprivate/OEBPS/Images/Figure-P193_24981.jpg?sign=1739149932-qf9A2XOHWaS0GJGTvmDKvY3KQnOYEr2L-0-2351a73cc9015e3a608164bcd214c5ca)
图8.7 弹出异常提示对话框(1)
![](https://epubservercos.yuewen.com/23D367/15936052205027606/epubprivate/OEBPS/Images/Figure-P193_24982.jpg?sign=1739149932-lu1xY7omGz3yDKslMczgswDb5RjU7sfR-0-97577a846e89df57ab22ea6a7d720e75)
图8.8 弹出异常提示对话框(2)
![](https://epubservercos.yuewen.com/23D367/15936052205027606/epubprivate/OEBPS/Images/Figure-P193_24985.jpg?sign=1739149932-b9Kt4HV14ky6hcWdnmbDbHGwYhhHAgyy-0-c23d3e5eaeed9dbf21ff526a86affdb9)
图8.9 弹出异常提示对话框(3)
代码如下:
![](https://epubservercos.yuewen.com/23D367/15936052205027606/epubprivate/OEBPS/Images/Figure-P193_71709.jpg?sign=1739149932-Zwzzj9LkEBxSxRWCHlz560MoK79aTg7c-0-9e4ce298c95bbb6a6de4d5e73572d9e8)
在该实例中,抛出第一个异常后,将弹出“try区域运行时有异常发生”提示信息对话框。继续执行外部catch区域的语句,程序尝试调用页面中并不存在的对象,将发生异常,此时弹出“catch区域运行时有异常发生”提示信息对话框。最后执行finally区域的语句,弹出相应对话框。
2.Error对象
try...catch...finally语句中,catch捕捉到的对象通常为Error对象。Error类是所有用于抛出异常的类的基类,类似于Java语言中用于抛出异常的基类Exception。JavaScript中用于抛出异常的类如表8.1所示。
表8.1 JavaScript中用于抛出异常的类
![](https://epubservercos.yuewen.com/23D367/15936052205027606/epubprivate/OEBPS/Images/Figure-T194_71710.jpg?sign=1739149932-w6MtxXbZHysvO45Cd6AbnkLOiP0gZPVT-0-b2fd281dbd95e1eeb4ca605c6f110fe1)
Error对象有以下两个属性。
name:表示异常类型的字符串。
message:实际的异常信息。
【例8.4】 验证Error对象的属性。(实例位置:资源包\TM\sl\8\04)
本实例将异常提示信息放置在弹出的提示对话框中,其中包括异常的具体信息以及异常类型的字符串。运行结果如图8.10所示。
![](https://epubservercos.yuewen.com/23D367/15936052205027606/epubprivate/OEBPS/Images/Figure-P195_25212.jpg?sign=1739149932-PzRXpiaxMD0Mc0UjxGZPhWdNiYAFdkOl-0-77c7f620eff8c00099267c4804a2b168)
图8.10 异常信息提示对话框
代码如下:
![](https://epubservercos.yuewen.com/23D367/15936052205027606/epubprivate/OEBPS/Images/Figure-P194_71711.jpg?sign=1739149932-UGvoSkrbcmZCw20dFKIfuNrcS3h5GGrx-0-fd5fa3bab25e00fa1329af34d3942afe)
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所示。
![](https://epubservercos.yuewen.com/23D367/15936052205027606/epubprivate/OEBPS/Images/Figure-P195_25213.jpg?sign=1739149932-w0igpumQkmvDAVCIgjCU1oziTZO2WN9f-0-e72a4487a65b227b919f825b4d9adee4)
图8.11 使用throw语句抛出异常
代码如下:
![](https://epubservercos.yuewen.com/23D367/15936052205027606/epubprivate/OEBPS/Images/Figure-P195_71714.jpg?sign=1739149932-qmvC4848Y1i3vuNzAxuxgATDTmXFcFZp-0-fe6c58dacca70bcb174b2ac34c37ade2)
读者从程序中可以看出,当变量num为无穷大时,使用throw语句抛出异常。此异常在catch区域被捕捉,并将异常提示信息放置在弹出的错误提示对话框中。