Javascript高級程序設計第17章(錯誤處理與調試)

1.try-catch語句

 try{  //可能會導致錯誤的代碼

}catch(error){  //在發生錯誤時怎麼處理

//alert(error.message);

//alert(error.name),例如TypeError

}

與其他語言不同,即使你不想使用這個錯誤對象,也要給它起個名字

message屬性是所有瀏覽器都支持的屬性,它保存着錯誤消息

finally子句

function testFinally(){
            try {
                return 2;
            } catch (error){
                return 1;
            } finally {
                return 0;
            }
        }
        
        function testWithoutFinally(){
            try {
                return 2;
            } catch (error){
                return 1;
            }
        }
        
        alert(testFinally());
        alert(testWithoutFinally());

只要代碼中包含finally子句,則無論try或catch語句塊中包含什麼代碼----甚至return語句,也不會阻止finally子句的執行


2.錯誤類型

Error:這個基類型的主要目的是供開發人員拋出自定義錯誤

ReferenceError:通常在訪問不存在的變量時,就會發生這種錯誤

SyntaxError:顧名思義

TypeError:在變量中保存着意外的類型時,或者在訪問不存在的方法。歸根到底還是由於在執行特定於類型的操作時,變量的類型並不符合要求所致。

合理使用try-catch:使用try-catch最適合那些我們無法控制的錯誤。在大型項目中,我們不能修改這個項目的代碼,大可將函數的調用放在try-catch語句中。


3.拋出錯誤

與try-catch語句相配的還有一個throw操作符,用於隨時拋出自定義錯誤。在遇到throw操作符時,代碼會立即停止執行。僅當有try-catch語句捕獲到被拋出的值時,代碼纔會繼續執行。

拋出錯誤,我們認爲只應該捕獲那些你確切地知道該如何處理的錯誤。捕獲錯誤的目的在於避免瀏覽器以默認方式處理它們;而拋出錯誤的目的在於提供錯誤發生具體原因的消息。

如 throw new Error("some text"); 

可以利用原型鏈來繼承Error來創建自定義錯誤

function CustomError(message){       
            this.name = "CustomError";
            this.message = message;
        }
        
        CustomError.prototype = new Error();
    
        function process(values){
        
            if (!(values instanceof Array)){
                throw new CustomError("process(): Argument must be an array.");
            }
        
            values.sort();
        
            for (var i=0, len=values.length; i < len; i++){
                if (values[i] > 100){
                    return values[i];
                }
            }
        
            return -1;
        }

        process("string");


4.錯誤事件

①任何沒有通過try-catch處理的錯誤都會觸發window對象的error事件。

如果要執行onerror事件處理程序,必須使用DOM0級技術,它沒有遵循“DOM2級事件”的標準格式。

它接受三個參數:錯誤消息、錯誤所在的URL和行號。只有錯誤消息最有用

只要發生錯誤,無論是不是瀏覽器生成的,都會觸發error事件

window.onerror = function(message, url, line){
            alert(message);
            return false;
        };
        throw new Error("Something bad happened.");

return false 這行代碼可以阻止瀏覽器報告錯誤的默認行爲

通過返回false,這個函數實際上就充當了整個文檔中的try-catch語句,可以捕獲所有無代碼處理的運行時錯誤。這個事件處理程序是避免瀏覽器報告錯誤的最後一道防線,理想情況下,只要可能就不應該使用它。只要能夠適當地使用try-catch語句,就不會又錯誤交給瀏覽器,也就不會觸發error事件。

②圖像也支持error事件

只要圖像的src特性中的URL不能返回可以被識別的圖像格式,就會觸發error事件。反之,觸發onload事件


5.常見的錯誤類型

①類型轉換錯誤,在if、for、while等流控制語句中使用非布爾值時,最常發生類型轉換錯誤

建議使用全等(===)和不全等(!==)操作符來比較數值,以避免類型轉換

②數據類型錯誤

識別類型對於非對象用typeof,對象用 instanceof

③通信錯誤

第一種錯誤通信錯誤與格式不正確的URL或發送的數據有關。最常見的問題是在數據發送給服務器之前,沒有使用encodeURLComponent()對數據進行編碼。

對於查詢字符串,應該記住必須要使用encodeURLComponent()方法


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