異常處理

概述:

在代碼的運行過程中,錯誤是不可避免的,總的來說,錯誤發生於兩種情況:一是程序內部的邏輯或者語法錯誤,二是運行環境或者用戶輸入中不可預知的數據造成的錯誤。對於前者,就稱之爲錯誤(error),可以通過調試程序來解決;而後一種則更 多的稱之爲異常(exception),顧名思義,就是超出常規,沒有按程序設計的意願來輸入數據。當然,異常還會有許多種類型。

所以說,異常並不等價於錯誤,相反,有時還會利用異常來解決一些問題。JavaScript可以捕獲一個異常並進行相應的處理,從而避免了瀏覽器向用戶報錯。

 

1.使用try-catch-finally處理異常

用戶可以使用該結構處理可能發生異常的代碼,如果發生異常,則由catch捕獲並進行處理,其語法如下: 

try{
        //要執行的代碼
}
catch(e){

        //處理異常的代碼
}finally{

        //無論異常發生與否,都會執行的代碼
}

通過異常處理,可以避免程序停止運行,從而具有了一定的自我修復能力。

在Ajax開發中,利用異常處理的一個典型應用就是創建XMLHttpRequest對象,不同瀏覽器創建它的方式是不一樣的,爲了使代碼能夠跨瀏覽器運行,就可以利用異常,一種方法不行,再用另一種方法,直到不發生異常爲止,例如:

<script language="JavaScript" type="text/javascript">

<!—

var xmlhttp;

try{
       //嘗試用IE瀏覽器的方式創建XMLHttpRequest對象
       xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}catch(e){

       try{

            //嘗試用非IE瀏覽器的方式常見XMLHttpRequest對象
            xmlhttp=new XMLHttpRequest();

       }catch(e){}

}
//-->
</script>

通過這種方式,就可以跨瀏覽器創建XMLHttpRequest對象。注意,即使不在catch塊內進行處理,catch標識及其參數e也是必須寫的,否則會產生語法錯誤,而finally則不是必須的。

2.使用throw語句拋出異常

在JavaScript中有其內部的異常機制,在遇到非法操作時能自動拋出異常。實際的開發中,隨着程序的複雜,需要能自己實現異常,這可以通過throw語句來實現:

throw value;

其中value就是要拋出的異常變量,它可以是JavaScript中的任何一種類型。但在JavaScript內部的異常中,異常參數(即 catch(e)中的e)是一個名爲error的對象,可以通過new Error(message)來創建這個對象,異常的描述被作爲error對象的一個屬性message,可以由構造函數傳入,也可以之後賦值。通過這個 異常描述message,可以讓程序獲取異常的詳細信息,從而自動處理。

下面的程序計算兩個數據的和,如果參數不是數字,則拋出異常,代碼如下:

<script language="JavaScript" type="text/javascript">

<!—

//函數默認要求參數爲數字
function sum(a,b){

       a=parseInt(a);

       b=parseInt(b);

       //如果a或b不能轉換爲數字則拋出一個異常對象

       if(isNaN(a) || isNaN(b)){

               throw new Error("arguments are not numbers");

       }

       return a+b;

}

try{

       //錯誤的調用

       var s=sum("c","d");

}catch(e){

       //顯示異常的詳細信息

       alert(e.message);

}
//-->
</script>

程序中使用字母作爲參數傳遞給sum函數,是錯誤的,所以函數內拋出了一個異常對象,這個對象被catch語句獲取,並使用alert語句顯示了其詳細信息。

注意:使用new Error(message)創建異常對象只是一種默認的習慣,也是內置異常的實現方式。這不是必需的,完全可以拋出任意數據類型的異常,例如一個整數,來作爲異常的描述。只要在程序中拋出異常和捕獲異常能匹配即可。

Error對象除了message屬性以外,還有一些其他的屬性,這些屬性因瀏覽器而異,例如:在IE瀏覽器中,error對象的屬性包括name、 number、description、message;而在Firefox瀏覽器中,error對象的屬性包括message、fileName、 lineNumber、stack、name。在實際的應用中如果要實現自己的異常,這些屬性只要被賦值,都是可用的,其中Firefox瀏覽器還會自動 對stack屬性賦值,用於顯示異常出現的位置。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章