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