JavaScript高級程序設(shè)計 錯誤處理與調(diào)試學(xué)習(xí)筆記
更新時間:2011年09月10日 02:48:20 作者:
JavaScript高級程序設(shè)計 錯誤處理與調(diào)試學(xué)習(xí)筆記,學(xué)習(xí)js的朋友可以參考下。
第十四章 錯誤處理與調(diào)試
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{
//可能會導(dǎo)致錯誤的代碼
}catch(error){
//錯誤發(fā)生時怎么處理
}
□錯誤發(fā)生時catch快回收到一個包含錯誤信息的對象。有一個兼容所有瀏覽器的message屬性。
2.1.1 finally子句
try-catch子句可選,finally子句一經(jīng)使用,其代碼無論如何都會執(zhí)行。
2.1.2 錯誤類型
□Error:基類型。主要目的是供開發(fā)人員拋出自定義錯誤。
□EvalError:用eval()函數(shù)發(fā)生異常時拋出。
□RangeError:數(shù)值超出相應(yīng)范圍時觸發(fā)。
□ReferenceError:找不到對象的情況下
□SyntaxError:把語法錯誤的JavaScript字符串傳入eval()函數(shù)。
□TypeError:變量中保存著意外的類型時,或訪問不存在的方法時。
□URIError:使用encodeURI()或decodeURI(),而URI格式不正確時。
根據(jù)不同的錯誤類型,進(jìn)行錯誤處理:
try{
soemFunction();
}catch(error){
if(error instanceof TypeError){
//處理類型錯誤
}else if(error instanceof ReferenceError){
//處理引用錯誤
}else{
//處理其他類型錯誤
}
}
2.1.3 善用try-catch
□使用try-catch語句,瀏覽器會認(rèn)為錯誤已經(jīng)被處理。
□使用try-catch語句,最適用吹那些我們無法控制的錯誤。
□明明白白地知道自己代碼發(fā)生錯誤就不該用try-catch而是修復(fù)錯誤。
2.2 拋出錯誤
①與try-catch語句相配有一個throw操作符。在遇到throw操作符時,代碼立即停止執(zhí)行。僅當(dāng)有try-catch語句捕獲到被拋出的值時,代碼才會繼續(xù)執(zhí)行。
②throw new Error("something bad happened."); 或利用原型鏈通過繼承Error來創(chuàng)建自定義錯誤類型。
2.2.1 拋出錯誤的時機(jī)
2.2.2 拋出錯誤與使用try-catch
2.2.3 錯誤(error)事件
①任何沒有通過try-catch處理的錯誤都會觸發(fā)window對象的error事件。
②任何瀏覽器中,onerror事件處理程序都不會創(chuàng)建event對象。但可接受3個參數(shù):錯誤消息、錯誤所在的URL和行號。(只有錯誤消息有用)
③指定onerror事件處理程序,必須使用DOM0級技術(shù)。
window.onerror = function(message,url,line){
alert(message);
return false; //通過返回false,此函數(shù)實際上充當(dāng)了整個文檔的try-catch語句可捕獲所有無代碼處理的運(yùn)行時錯誤。
};
④圖像也支持error事件。只要圖像的src特性中URL不能返回可以被識別的圖像格式,就會觸發(fā)error事件。此時的error事件遵循DOM格式,會返回一個以圖像為目標(biāo)的event對象。
3.錯誤處理策略
3.1 常見的錯誤類型
□類型轉(zhuǎn)換錯誤
□數(shù)據(jù)類型錯誤
□通信錯誤
3.1.1 類型轉(zhuǎn)換錯誤
類型轉(zhuǎn)換錯誤發(fā)生在使用某個操作符,或者使用其他可能會自動轉(zhuǎn)換值的數(shù)據(jù)類型的語言結(jié)構(gòu)時。在使用相等(==)和不相等(!==)操作符,或者if、for及while等流控制語句中使用非布爾值時,最常發(fā)生類型轉(zhuǎn)換錯誤。
3.1.2 數(shù)據(jù)類型錯誤
在預(yù)料之外的值傳給函數(shù)的情況下,最容易發(fā)生數(shù)據(jù)類型錯誤。
3.1.3 通信錯誤
①URL格式不正確或發(fā)送的數(shù)據(jù)有問題。對查詢字符串,必須使用encodeURIComponent()方法。
②在服務(wù)器響應(yīng)的數(shù)據(jù)不正確時,也會發(fā)生通信錯誤。
3.2 區(qū)分致命錯誤和非致命錯誤
①非致命錯誤
□不影響用戶的主要任務(wù)
□只影響頁面的一部分
□可以恢復(fù)
□重復(fù)相同操作可以消除錯誤
②致命錯誤
□應(yīng)用程序根本無法運(yùn)行
□錯誤明顯影響到了用戶的主要操作
□會導(dǎo)致其他連帶錯誤
3.3把錯誤記錄到服務(wù)器:(略)
4.調(diào)試技術(shù)
4.1 將消息記錄到控制臺
①IE8、Firefox、Chrome和Safari來說,可通過console對象向JavaScript控制臺中寫入消息。對象有下列方法:
□error(message):將錯誤消息記錄到控制臺
□info(message):將信息消息記錄到控制臺
□log(message):將一般消息記錄到控制臺
□warn(message):將警告消息記錄到控制臺
②還有一種方案是使用LiveConnect,也就是JavaScript中運(yùn)行Java代碼。
③向JavaScript控制臺寫入消息的統(tǒng)一接口:
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 將消息記錄到當(dāng)前頁面
4.3 拋出錯誤
①對大型應(yīng)用程序來說,自定義的錯誤通常使用assert()函數(shù)拋出。對這個函數(shù)接受兩個參數(shù),一個是求值結(jié)果為true的條件,另一個是條件為false時要拋出的錯誤。
function assert(condition, message){
if(!condition){
throw new Error(message);
}
}
②應(yīng)用:
function divide(num1,num2){
assert(typeof num1 == "number"&&typeof num2== "number","divide():Both arguments must be numbers.");
return num1/num2;
}
5.常見的IE錯誤
□操作終止
□無效字符
□未找到成員
□未知運(yùn)行時錯誤
□語法錯誤
□系統(tǒng)無法找到指定資源
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{
//可能會導(dǎo)致錯誤的代碼
}catch(error){
//錯誤發(fā)生時怎么處理
}
□錯誤發(fā)生時catch快回收到一個包含錯誤信息的對象。有一個兼容所有瀏覽器的message屬性。
2.1.1 finally子句
try-catch子句可選,finally子句一經(jīng)使用,其代碼無論如何都會執(zhí)行。
2.1.2 錯誤類型
□Error:基類型。主要目的是供開發(fā)人員拋出自定義錯誤。
□EvalError:用eval()函數(shù)發(fā)生異常時拋出。
□RangeError:數(shù)值超出相應(yīng)范圍時觸發(fā)。
□ReferenceError:找不到對象的情況下
□SyntaxError:把語法錯誤的JavaScript字符串傳入eval()函數(shù)。
□TypeError:變量中保存著意外的類型時,或訪問不存在的方法時。
□URIError:使用encodeURI()或decodeURI(),而URI格式不正確時。
根據(jù)不同的錯誤類型,進(jìn)行錯誤處理:
try{
soemFunction();
}catch(error){
if(error instanceof TypeError){
//處理類型錯誤
}else if(error instanceof ReferenceError){
//處理引用錯誤
}else{
//處理其他類型錯誤
}
}
2.1.3 善用try-catch
□使用try-catch語句,瀏覽器會認(rèn)為錯誤已經(jīng)被處理。
□使用try-catch語句,最適用吹那些我們無法控制的錯誤。
□明明白白地知道自己代碼發(fā)生錯誤就不該用try-catch而是修復(fù)錯誤。
2.2 拋出錯誤
①與try-catch語句相配有一個throw操作符。在遇到throw操作符時,代碼立即停止執(zhí)行。僅當(dāng)有try-catch語句捕獲到被拋出的值時,代碼才會繼續(xù)執(zhí)行。
②throw new Error("something bad happened."); 或利用原型鏈通過繼承Error來創(chuàng)建自定義錯誤類型。
2.2.1 拋出錯誤的時機(jī)
2.2.2 拋出錯誤與使用try-catch
2.2.3 錯誤(error)事件
①任何沒有通過try-catch處理的錯誤都會觸發(fā)window對象的error事件。
②任何瀏覽器中,onerror事件處理程序都不會創(chuàng)建event對象。但可接受3個參數(shù):錯誤消息、錯誤所在的URL和行號。(只有錯誤消息有用)
③指定onerror事件處理程序,必須使用DOM0級技術(shù)。
window.onerror = function(message,url,line){
alert(message);
return false; //通過返回false,此函數(shù)實際上充當(dāng)了整個文檔的try-catch語句可捕獲所有無代碼處理的運(yùn)行時錯誤。
};
④圖像也支持error事件。只要圖像的src特性中URL不能返回可以被識別的圖像格式,就會觸發(fā)error事件。此時的error事件遵循DOM格式,會返回一個以圖像為目標(biāo)的event對象。
3.錯誤處理策略
3.1 常見的錯誤類型
□類型轉(zhuǎn)換錯誤
□數(shù)據(jù)類型錯誤
□通信錯誤
3.1.1 類型轉(zhuǎn)換錯誤
類型轉(zhuǎn)換錯誤發(fā)生在使用某個操作符,或者使用其他可能會自動轉(zhuǎn)換值的數(shù)據(jù)類型的語言結(jié)構(gòu)時。在使用相等(==)和不相等(!==)操作符,或者if、for及while等流控制語句中使用非布爾值時,最常發(fā)生類型轉(zhuǎn)換錯誤。
3.1.2 數(shù)據(jù)類型錯誤
在預(yù)料之外的值傳給函數(shù)的情況下,最容易發(fā)生數(shù)據(jù)類型錯誤。
3.1.3 通信錯誤
①URL格式不正確或發(fā)送的數(shù)據(jù)有問題。對查詢字符串,必須使用encodeURIComponent()方法。
②在服務(wù)器響應(yīng)的數(shù)據(jù)不正確時,也會發(fā)生通信錯誤。
3.2 區(qū)分致命錯誤和非致命錯誤
①非致命錯誤
□不影響用戶的主要任務(wù)
□只影響頁面的一部分
□可以恢復(fù)
□重復(fù)相同操作可以消除錯誤
②致命錯誤
□應(yīng)用程序根本無法運(yùn)行
□錯誤明顯影響到了用戶的主要操作
□會導(dǎo)致其他連帶錯誤
3.3把錯誤記錄到服務(wù)器:(略)
4.調(diào)試技術(shù)
4.1 將消息記錄到控制臺
①IE8、Firefox、Chrome和Safari來說,可通過console對象向JavaScript控制臺中寫入消息。對象有下列方法:
□error(message):將錯誤消息記錄到控制臺
□info(message):將信息消息記錄到控制臺
□log(message):將一般消息記錄到控制臺
□warn(message):將警告消息記錄到控制臺
②還有一種方案是使用LiveConnect,也就是JavaScript中運(yùn)行Java代碼。
③向JavaScript控制臺寫入消息的統(tǒng)一接口:
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 將消息記錄到當(dāng)前頁面
4.3 拋出錯誤
①對大型應(yīng)用程序來說,自定義的錯誤通常使用assert()函數(shù)拋出。對這個函數(shù)接受兩個參數(shù),一個是求值結(jié)果為true的條件,另一個是條件為false時要拋出的錯誤。
function assert(condition, message){
if(!condition){
throw new Error(message);
}
}
②應(yīng)用:
function divide(num1,num2){
assert(typeof num1 == "number"&&typeof num2== "number","divide():Both arguments must be numbers.");
return num1/num2;
}
5.常見的IE錯誤
□操作終止
□無效字符
□未找到成員
□未知運(yùn)行時錯誤
□語法錯誤
□系統(tǒng)無法找到指定資源
相關(guān)文章
Bootstrap禁用響應(yīng)式布局的實現(xiàn)方法
這篇文章主要介紹了Bootstrap禁用響應(yīng)式布局的實現(xiàn)方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-03-03JavaScript控制各種瀏覽器全屏模式的方法、屬性和事件介紹
瀏覽器全屏模式的啟動函數(shù)requestFullscreen仍然需要附帶各瀏覽器的js方言前綴,相信下面這段代碼需要你花大量的搜索才能湊齊:2014-04-04