隨筆 - 14, 文章 - 39, 評(píng)論 - 17, 引用 - 0
          數(shù)據(jù)加載中……

          javascript 異常處理 [轉(zhuǎn)]

          異常 處理概述
          在代碼的運(yùn)行過(guò)程中,錯(cuò)誤是不可避免的,總的來(lái)說(shuō),錯(cuò)誤發(fā)生于兩種情況:一是程序內(nèi)部的邏輯或者語(yǔ)法錯(cuò)誤,二是運(yùn)行環(huán)境或者用戶輸入中不可預(yù)知的數(shù)據(jù)造成的錯(cuò)誤。對(duì)于前者,就稱之為錯(cuò)誤(error),可以通過(guò)調(diào)試程序來(lái)解決;而后一種則更多的稱之為異常(exception),顧名思義,就是超出常規(guī),沒(méi)有按程序設(shè)計(jì)的意愿來(lái)輸入數(shù)據(jù)。當(dāng)然,異常還會(huì)有許多種類型。
          所以說(shuō),異常并不等價(jià)于錯(cuò)誤,相反,有時(shí)還會(huì)利用異常來(lái)解決一些問(wèn)題。JavaScript可以捕獲一個(gè)異常并進(jìn)行相應(yīng)的處理,從而避免了瀏覽器向用戶報(bào)錯(cuò)。

          使用try-catch-finally處理異常
          用戶可以使用該結(jié)構(gòu)處理可能發(fā)生異常的代碼,如果發(fā)生異常,則由catch捕獲并進(jìn)行處理,其語(yǔ)法如下:
          try{
          ?????? //要執(zhí)行的代碼
          }
          catch(e){
          ?????? //處理異常的代碼
          }
          finally{
          ?????? //無(wú)論異常發(fā)生與否,都會(huì)執(zhí)行的代碼
          }
          通過(guò)異常處理,可以避免程序停止運(yùn)行,從而具有了一定的自我修復(fù)能力。
          在Ajax開(kāi)發(fā)中,利用異常處理的一個(gè)典型應(yīng)用就是創(chuàng)建XMLHttpRequest對(duì)象,不同瀏覽器創(chuàng)建它的方式是不一樣的,為了使代碼能夠跨瀏覽器運(yùn)行,就可以利用異常,一種方法不行,再用另一種方法,直到不發(fā)生異常為止,例如:
          <script language="JavaScript" type="text/javascript">
          <!--
          var xmlhttp;
          try{
          ????? //嘗試用IE瀏覽器的方式創(chuàng)建XMLHttpRequest對(duì)象
          ????? xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
          }catch(e){
          ????? try{
          ?????????? //嘗試用非IE瀏覽器的方式常見(jiàn)XMLHttpRequest對(duì)象
          ?????????? xmlhttp=new XMLHttpRequest();
          ????? }catch(e){}
          }
          //-->
          </script>
          通過(guò)這種方式,就可以跨瀏覽器創(chuàng)建XMLHttpRequest對(duì)象。注意,即使不在catch塊內(nèi)進(jìn)行處理,catch標(biāo)識(shí)及其參數(shù)e也是必須寫的,否則會(huì)產(chǎn)生語(yǔ)法錯(cuò)誤,而finnally則不是必須的。

          使用throw語(yǔ)句拋出異常
          JavaScript中有其內(nèi)部的異常機(jī)制,在遇到非法操作時(shí)能自動(dòng)拋出異常。實(shí)際的開(kāi)發(fā)中,隨著程序的復(fù)雜,需要能自己實(shí)現(xiàn)異常,這可以通過(guò)throw語(yǔ)句來(lái)實(shí)現(xiàn):
          throw value;
          其中value就是要拋出的異常變量,它可以是JavaScript中的任何一種類型。但在JavaScript內(nèi)部的異常中,異常參數(shù)(即catch(e)中的e)是一個(gè)名為error的對(duì)象,可以通過(guò)new Error(message)來(lái)創(chuàng)建這個(gè)對(duì)象,異常的描述被作為error對(duì)象的一個(gè)屬性message,可以由構(gòu)造函數(shù)傳入,也可以之后賦值。通過(guò)這個(gè)異常描述message,可以讓程序獲取異常的詳細(xì)信息,從而自動(dòng)處理
          下面的程序計(jì)算兩個(gè)數(shù)據(jù)的和,如果參數(shù)不是數(shù)字,則拋出異常,代碼如下:
          <script language="JavaScript" type="text/javascript">
          <!--
          //函數(shù)默認(rèn)要求參數(shù)為數(shù)字
          function sum(a,b){
          ????? a=parseInt(a);
          ????? b=parseInt(b);
          ????? //如果a或b不能轉(zhuǎn)換為數(shù)字則拋出一個(gè)異常對(duì)象
          ????? if(isNaN(a) || isNaN(b)){
          ????????????? throw new Error("arguments are not numbers");
          ????? }
          ????? return a+b;
          }

          try{
          ????? //錯(cuò)誤的調(diào)用
          ????? var s=sum("c","d");
          }catch(e){
          ????? //顯示異常的詳細(xì)信息
          ????? alert(e.message);
          }
          //-->
          </script>
          程序中使用字母作為參數(shù)傳遞給sum函數(shù),是錯(cuò)誤的,所以函數(shù)內(nèi)拋出了一個(gè)異常對(duì)象,這個(gè)對(duì)象被catch語(yǔ)句獲取,并使用alert語(yǔ)句顯示了其詳細(xì)信息。
          注意:使用new Error(message)創(chuàng)建異常對(duì)象只是一種默認(rèn)的習(xí)慣,也是內(nèi)置異常的實(shí)現(xiàn)方式。這不是必需的,完全可以拋出任意數(shù)據(jù)類型的異常,例如一個(gè)整數(shù),來(lái)作為異常的描述。只要在程序中拋出異常和捕獲異常能匹配即可。

          Error對(duì)象除了message屬性以外,還有一些其他的屬性,這些屬性因?yàn)g覽器而異,例如:在IE瀏覽器中,error對(duì)象的屬性包括name、number、description、message;而在Firefox瀏覽器中,error對(duì)象的屬性包括message、fileName、lineNumber、stack、name。在實(shí)際的應(yīng)用中如果要實(shí)現(xiàn)自己的異常,這些屬性只要被賦值,都是可用的,其中Firefox瀏覽器還會(huì)自動(dòng)對(duì)stack屬性賦值,用于顯示異常出現(xiàn)的位置。



          posted on 2007-02-15 11:18 mlw2000 閱讀(252) 評(píng)論(0)  編輯  收藏 所屬分類: JavaScript

          主站蜘蛛池模板: 拜泉县| 荥经县| 林周县| 广南县| 荣成市| 河源市| 四平市| 峨边| 泰安市| 咸宁市| 仙居县| 枞阳县| 天镇县| 洛南县| 岑溪市| 南通市| 民丰县| 思南县| 嵊泗县| 疏勒县| 潜山县| 榆中县| 衢州市| 开平市| 六盘水市| 霍山县| 林芝县| 松原市| 汉川市| 得荣县| 大同县| 蛟河市| 蓬莱市| 安仁县| 琼海市| 丹江口市| 惠州市| 商河县| 杭锦旗| 天气| 卓尼县|