JavaScript進階程式設計 錯誤處理與調試學習筆記
來源:互聯網
上載者:User
第十四章 錯誤處理與調試
1.開啟瀏覽器錯誤報表
1.1 Internet Explorer
□Toos → Internet Option → Anvanced → Display a notification about every script error
1.2 Firefox
□Tools → Error Console (Firebug)
1.3 Safari
□Edit → Preferences → Advanced → Show develop menu in menubar/Develop → Show Error Console
1.4 Opera
□Tools → Advanced → Error Console
1.5 Chrome
□Control this page → Developer → JavaScript console
2.錯誤處理
2.1 Try-catch語句
try{
//可能會導致錯誤的代碼
}catch(error){
//錯誤發生時怎麼處理
}
□錯誤發生時catch快回收到一個包含錯誤資訊的對象。有一個相容所有瀏覽器的message屬性。
2.1.1 finally子句
try-catch子句可選,finally子句一經使用,其代碼無論如何都會執行。
2.1.2 錯誤類型
□Error:基底類型。主要目的是供開發人員拋出自訂錯誤。
□EvalError:用eval()函數發生異常時拋出。
□RangeError:數值超出相應範圍時觸發。
□ReferenceError:找不到對象的情況下
□SyntaxError:把語法錯誤的JavaScript字串傳入eval()函數。
□TypeError:變數中儲存著意外的類型時,或訪問不存在的方法時。
□URIError:使用encodeURI()或decodeURI(),而URI格式不正確時。
根據不同的錯誤類型,進行錯誤處理:
try{
soemFunction();
}catch(error){
if(error instanceof TypeError){
//處理類型錯誤
}else if(error instanceof ReferenceError){
//處理引用錯誤
}else{
//處理其他類型錯誤
}
}
2.1.3 善用try-catch
□使用try-catch語句,瀏覽器會認為錯誤已經被處理。
□使用try-catch語句,最適用吹那些我們無法控制的錯誤。
□明明白白地知道自己代碼發生錯誤就不該用try-catch而是修複錯誤。
2.2 拋出錯誤
①與try-catch語句相配有一個throw操作符。在遇到throw操作符時,代碼立即停止執行。僅當有try-catch語句捕獲到被拋出的值時,代碼才會繼續執行。
②throw new Error("something bad happened."); 或利用原型鏈通過繼承Error來建立自訂錯誤類型。
2.2.1 拋出錯誤的時機
2.2.2 拋出錯誤與使用try-catch
2.2.3 錯誤(error)事件
①任何沒有通過try-catch處理的錯誤都會觸發window對象的error事件。
②任何瀏覽器中,onerror事件處理常式都不會建立event對象。但可接受3個參數:錯誤訊息、錯誤所在的URL和行號。(只有錯誤訊息有用)
③指定onerror事件處理常式,必須使用DOM0級技術。
window.onerror = function(message,url,line){
alert(message);
return false; //通過返回false,此函數實際上充當了整個文檔的try-catch語句可捕獲所有無代碼處理的執行階段錯誤。
};
④映像也支援error事件。只要映像的src特性中URL不能返回可以被識別的映像格式,就會觸發error事件。此時的error事件遵循DOM格式,會返回一個以映像為目標的event對象。
3.錯誤處理策略
3.1 常見的錯誤類型
□類型轉換錯誤
□資料類型錯誤
□通訊錯誤
3.1.1 類型轉換錯誤
類型轉換錯誤發生在使用某個操作符,或者使用其他可能會自動轉換值的資料類型的語言結構時。在使用相等(==)和不相等(!==)操作符,或者if、for及while等流量控制語句中使用非布爾值時,最常發生類型轉換錯誤。
3.1.2 資料類型錯誤
在預料之外的值傳給函數的情況下,最容易發生資料類型錯誤。
3.1.3 通訊錯誤
①URL格式不正確或發送的資料有問題。對查詢字串,必須使用encodeURIComponent()方法。
②在伺服器響應的資料不正確時,也會發生通訊錯誤。
3.2 區分致命錯誤和非致命錯誤
①非致命錯誤
□不影響使用者的主要任務
□隻影響頁面的一部分
□可以恢複
□重複相同操作可以消除錯誤
②致命錯誤
□應用程式根本無法運行
□錯誤明顯影響到了使用者的主要操作
□會導致其他連帶錯誤
3.3把錯誤記錄到伺服器:(略)
4.調試技術
4.1 將訊息記錄到控制台
①IE8、Firefox、Chrome和Safari來說,可通過console對象向JavaScript控制台中寫入訊息。對象有下列方法:
□error(message):將錯誤訊息記錄到控制台
□info(message):將資訊訊息記錄到控制台
□log(message):將一般訊息記錄到控制台
□warn(message):將警告訊息記錄到控制台
②還有一種方案是使用LiveConnect,也就是JavaScript中運行Java代碼。
③向JavaScript控制台寫入訊息的統一介面:
function log(message){
if(typeof console == "object"){
console.log(message);
}else if(typeof opera == "object"){
opera.postError(message);
}else if(typeof java == "object" && typeof java.lang == "object"){
java.lang.System.out.println(message);
}
}
4.2 將訊息記錄到當前頁面
4.3 拋出錯誤
①對大型應用程式來說,自訂的錯誤通常使用assert()函數拋出。對這個函數接受兩個參數,一個是求值結果為true的條件,另一個是條件為false時要拋出的錯誤。
function assert(condition, message){
if(!condition){
throw new Error(message);
}
}
②應用:
function divide(num1,num2){
assert(typeof num1 == "number"&&typeof num2== "number","divide():Both arguments must be numbers.");
return num1/num2;
}
5.常見的IE錯誤
□操作終止
□無效字元
□未找到成員
□未知執行階段錯誤
□語法錯誤
□系統無法找到指定資源