零基础学JavaScript
上QQ阅读APP看书,第一时间看更新

4.6 异常处理语句

在JavaScript中,可以对产生的异常进行处理。所谓异常是指在程序中产生了某些异常情况或错误。处理这些异常情况或错误所使用的语句,就是异常处理语句。在JavaScript中的异常处理语句包括throw语句与try...catch...finally语句两种。

4.6.1 throw语句

throw(抛出)语句的作用是抛出一个异常。所谓的抛出异常,就是用信号通知发生了异常情况或错误。throw语句的语法代码如下所示:


throw 表达式

以上代码中的表达式,可以是任何类型的表达式。该表达式通常是一个Error对象或Error对象的某个实例。

【实例4.17】有关throw语句的使用方法请看以下代码,注意加粗的文字:


01   <html>
02      <head>
03         <title>throw语句</title>
04         <script type="text/javascript">
05            <!--
06               function myFun(x,y)
07               {
08                  if (y==0)
09                  {
10                     throw new Error("除数不能为0");
11                  }
12                  return x/y;
13               }
14               myFun(1,0);
15            -->
16         </script>
17      </head>
18      <body>
19      </body>
20   </html>

【代码说明】在本例中,第6行定义了一个名为“myFun”的函数,该函数的作用是返回两个参数相除后的结果。由于除数不能为0,所以在函数体中,如果检测到除数为0,就用throw语句抛出异常。

【运行效果】以上代码为本书配套代码文件目录“代码\第04章\sample17.htm”里的内容。运行结果如图4.15所示。

图4.15 sample17.htm的运行结果

4.6.2 try...catch...finally语句

try...catch...finally语句是JavaScript中的用于处理异常的语句,该语句与throw语句不同。throw语句只是抛出一个异常,但对该异常并不进行处理,而try...catch...finally语句可以处理所抛出的异常。try...catch...finally语句的语法代码如下所示:


try
 <语句块1>
catch(e)
 <语句块2>
finally
 <语句块3>

以上代码的解释如下:

■<语句块1>是有可能要抛出异常的语句块。

■catch(e)中的e,是一个变量,该变量为从try语句块中抛出的Error对象或其他值。

■<语句块2>是处理异常的语句块。如果在<语句块1>中没有抛出异常,则不执行该语句块中的语句。

■无论在<语句块1>中是否抛出异常,JavaScript都会执行<语句块3>中的语句。<语句块3>中的语句与finally关键字可以一起省略。

【实例4.18】有关try...catch...finally语句的使用方法请看以下代码,注意加粗的文字:


01   <html>
02      <head>
03         <title>try...catch...finally语句</title>
04         <script type="text/javascript">
05            <!--
06               function myFun()
07               {
08                  try
09                  {
10                     document.write("函数开始执行<br>");
11                     //调用了一个不存在的函数
12                     alerta("这是一个错误的函数名");
13                     document.write("函数正在执行");
14                  }
15                  catch(ex)
16                  {
17                     document.write(ex.message + "<br>");
18                  }
19                  finally
20                  {
21                     document.write("函数执行完毕");
22                  }
23               }
24               myFun();
25            -->         
26         </script>
27      </head>
28      <body>
29      </body>
30   </html>

【代码说明】在本例中,代码6~23行定义了一个名为“myFun”的函数,然后调用该函数,该函数的运行过程如下所示:

(1)执行try后的语句块。

(2)执行“document.write("函数开始执行<br>");”语句,输出一行文字,如图4.16中的第一行文字。

(3)调用了一个不存在的函数“alerta()”,此时抛出异常。

(4)忽略try语句块中的产生异常之后的所有语句,本例中忽略了“document.write ("函数正在执行");”,因此在图4.16中并没有输出该文字。

(5)JavaScript用catch语句捕捉到抛出的异常,并赋值给变量ex。

(6)执行“document.write(ex.description + "<br>");”语句。

(7)执行“document.write("函数执行完毕");”。

【运行效果】以上代码为本书配套代码文件目录“代码\第04章\sample18.htm”里的内容,其运行结果如图4.16所示。

图4.16 sample18.htm的运行结果

4.6.3 异常处理语句的综合应用

try...catch...finally语句不仅可以接收到JavaScript抛出的异常,还可以接收到throw语句所抛出的异常。因此可以通过try...catch...finally语句与throw语句相结合来达到处理异常的目的。

【实例4.19】请看以下代码,注意加粗的文字:


01   <html>
02      <head>
03         <title>异常处理语句的综合应用</title>
04         <script type="text/javascript">
05            <!--
06               function myFun(x,y)
07               {
08                  var z;
09                  try
10                  {
11                     if (y==0)
12                     {
13                        throw new Error("除数不能为0");
14                     }
15                     z = x/y;
16                  }
17                  catch(ex)
18                  {
19                     z = ex.message;
20                  }
21                  return z;
22               }
23               document.write(myFun(1,0));
24            -->
25         </script>
26      </head>
27      <body>
28      </body>
29   </html>

【代码说明】在本例中,创建了一个名为“myFun”的函数,该函数的作用是将两个参数相除,并返回结果,如果在相除时产生异常,则返回错误信息。在本例中,catch语句可以接收到由throw语句抛出的异常,并进行处理。此时,在IE浏览器的左下角不会再出现错误信息。

【运行效果】以上代码为本书配套代码文件目录“代码\第04章\sample19.htm”里的内容,其运行结果如图4.17所示。

图4.17 sample19.htm的运行结果