天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

javascript 異常處理使用總結(jié)

JavaScript中的異常可以用try..catch..finally語句來處理,也可以手動的來拋出異常。
1.使用try..catch..finally語句來處理異常
js代碼在執(zhí)行過程中如果出現(xiàn)異常,會手動創(chuàng)建一個異常類對象,該異常類對象將被提交給瀏覽器,這個過程稱為“拋出異常”。當(dāng)瀏覽器接收到一場對象時,會尋找能處理這一異常的代碼并把當(dāng)前異常對象提交給其處理,這一過程被稱為“捕獲異常”。try..catch..finally語句的基本語法格式為:
復(fù)制代碼 代碼如下:
try{//可能拋出異常的代碼
}catch(error){//如果發(fā)生異常會執(zhí)行的代碼,error為發(fā)生的異常類對象
}finally{//無條件執(zhí)行的代碼
}

在上面的語句中,catch語句緊跟在try語句的后面,finally語句緊跟在catch的后面,這是一個完整的異常處理語句的寫法。其實,catch語句和finally語句都可以省略的,但是二者至少要保留其中之一和try語句結(jié)合使用。
在try塊中的語句并不一定是要拋出異常的語句,任何JavaScript語句都可以使用異常處理語句來處理,但這樣做沒有必要。當(dāng)try塊中某一行的代碼拋出了異常,則該行下方的代碼將不會被執(zhí)行,轉(zhuǎn)而直接執(zhí)行catch塊的代碼。
在catch塊中,catch語句后面括號中的error表示捕獲到的異常對象實例,該實例包含異常的詳細(xì)信息,可以根據(jù)這些信息作出適當(dāng)?shù)奶幚怼H绻鹀atch語句后還有finally語句,則繼續(xù)執(zhí)行finally塊中的語句。
finally塊中的語句是始終被執(zhí)行的語句,塊中的語句通常做一些最后的清理工作。如果在執(zhí)行finally塊之前,遇到return語句、continue語句或break語句等轉(zhuǎn)移流程的語句時,那么在執(zhí)行這些語句前finally塊中的代碼也要被執(zhí)行。
如果在一個異常處理語句中,只包含try..finally語句而沒有補貨異常的catch語句則執(zhí)行try塊中的語句后會直接執(zhí)行finally塊的語句,最后再將異常拋出。
例:
復(fù)制代碼 代碼如下:
<script>
try{
var date=new Date();
date.test();//調(diào)用date的未定義的test方法;
document.wrire("try塊執(zhí)行結(jié)束<br>");
}catch(error){
with(document){
write("出現(xiàn)了異常<br>");
write("異常類型:"+error.name+"<br>");
write("異常消息:"+error.message);
}
}finally{
document.write("異常處理完畢!");
}
</script>

結(jié)果:
出現(xiàn)了異常
異常類型:TypeError
異常消息:對象不支持此屬性或方法異常處理完畢!
2.手動拋出異常
除了發(fā)生運行時瀏覽器會拋出異常,開發(fā)人員也可以自己動手拋出異常。手動異常拋出的語句是throw,其基本語法格式為:
throw expression;

try catch finally 語句說明

try catch finally是Javascript語言提供的異常處理機(jī)制。語法結(jié)構(gòu)如下

try { //這段代碼從上往下運行,其中任何一個語句拋出異常該代碼塊就結(jié)束運行
}catch (e) { // 如果try代碼塊中拋出了異常,catch代碼塊中的代碼就會被執(zhí)行。 //e是一個局部變量,用來指向Error對象或者其他拋出的對象}finally {
 //無論try中代碼是否有異常拋出(甚至是try代碼塊中有return語句),finally代碼塊中始終會被執(zhí)行。 }

try…catch…finally…語法中除了try以外catch和finally都是可選的(兩者必須要有一個),也就是說try…catch…finally…語法有以下三種形式

try{

//some code

}

catch(e){

//somecode

}

finally{

//some code

}

try{

//some code

}

catch(e){

//somecode

}

try{

//some code

}

finally{

//some code

}

如果有一定catch,一旦try中代碼拋出異常以后就是先執(zhí)行catch中的代碼,然后執(zhí)行finally中的代碼。如果沒有catch語句,try中的代碼拋出異常后,就會先執(zhí)行finally中的語句,然后將try中拋出的異常以異常的方式繼續(xù)往上拋。

不管try代碼塊的執(zhí)行時如何被終止的(出現(xiàn)異常、return、自然終止)finally中的語句始終會被執(zhí)行,正是由于finally的這種特性,通常finally用來執(zhí)行一些清理工作。如果try中代碼是以return,continue,break的方式終止的,Javascript引擎會在執(zhí)行完finally中的語句以后再執(zhí)行相應(yīng)的try中的返回語句。

throw語句說明

 throw語句在Javascript1.4中已經(jīng)實現(xiàn)。try的語法很簡單,如下
throw expression;

其中的expression可以是任何一種類型,也就是說throw “There is a error” 或是throw 1001都是正確的。但通常我們會拋出一個Error對象或是Error對象的子類。關(guān)于Error我們稍后介紹,先看一段throw的樣例代碼。

function factorial(x) { // If the input argument is invalid, throw an exception! if (x < 0) throw new Error("x must not be negative"); // Otherwise, compute a value and return normally for(var f = 1; x > 1; f *= x, x--) /* empty */ ; return f;}

Error對象

Error對象和它的子類是在Javascript1.5中實現(xiàn)的。Error的構(gòu)造函數(shù)有兩種

new Error( )
new Error(message )

Error有兩個基本的屬性name和message。message用來表示異常的詳細(xì)信息。而name指的的是Error對象的構(gòu)造函數(shù)。此外,不同的js引擎對Error還各自提供了一些擴(kuò)展,例如mozilla提供了fileName(異常出現(xiàn)的文件名稱)和linenumber(異常出現(xiàn)的行號)的擴(kuò)展,而IE提供了number(錯誤號)的支持。不過name和message是兩個基本的屬性,在firefox和ie中都能夠支持。Javascript中Error還有幾個子類EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError,各自的意思就不在這里詳細(xì)描述了,讀者可以在我提供的參考文檔中找到相應(yīng)的參考。

Javascript的異常處理機(jī)制和window.onerror句柄

當(dāng)Javascript代碼中出現(xiàn)錯誤的時候,js引擎就會根據(jù)js的調(diào)用棧逐級尋找對應(yīng)的catch,如果沒有找到相應(yīng)的catch handler或catch handler本身又有error或者又拋出新的error,最后就會把這個error的處理交給瀏覽器,瀏覽器會用各自不同的方式(IE以黃色三角圖案顯示在左下角,而firefix會顯示在錯誤控制臺中)顯示錯誤信息給訪問者。很多場景下,我們會覺得這種錯誤提示方式不夠友好,而且提示信息很隱蔽,那么我們機(jī)會自定義這種錯誤提示的方式嗎?答案是有,就是window.onerror屬性。

Javascript的window對象有一個特別的屬性onerror,如果你將某個function賦值給window的onerror屬性,那么但凡這個window中有Javascript錯誤出現(xiàn),該function都會被調(diào)用,也就是說這個function會成為這個window的錯誤處理句柄。

// Display error messages in a dialog box, but never more than 3window.onerror = function(msg, url, line) { if (onerror.num++ < onerror.max) {  alert("ERROR: " + msg + "/n" + url + ":" + line);  return true; }}onerror.max = 3;onerror.num = 0;

onerror句柄會3個參數(shù)分別是錯誤信息提示,產(chǎn)生錯誤的Javascript的document ulr,錯誤出現(xiàn)的行號。

onerroe句柄的返回值也很重要,如果句柄返回true,表示瀏覽器無需在對該錯誤做額外的處理,也就是說瀏覽器不需要再顯示錯誤信息。而如果返回的是false,瀏覽器還是會提示錯誤信息。

window.onerror=function(){

alert(”xx”);

return true; //如果注釋掉該語句,瀏覽器中還是會有錯誤提示,反之則沒有。

}

function throwerror(){

throw new Error(”cc”);

}

1

我們在開發(fā)HTML的過程中避免不了一些Js的異常,通常我們也不可能依賴客戶打開瀏覽器的錯誤提示框(如上圖)來為我們定位bug提供線索,而利用window.onerror句柄我們就可以講錯誤提示信息顯示出來,客戶只要在錯誤出現(xiàn)的時候,提供相應(yīng)的截屏就可以了,這點可以很好的幫助開發(fā)人員定位,分析Javascript相關(guān)的錯誤。

參考資料

Mozilla Javascript1.5核心參考

Javascript犀牛(JavaScript: The Definitive Guide)

JavaScript技術(shù)javascript 異常處理使用總結(jié),轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 99re在这里只有精品 | 草699一码二码三码四码 | xxnx日本| 国产乱码伦人偷精品视频 | 老师给美女同学开嫩苞 | 日本免费一本天堂在线 | 国产高清视频在线观看97 | 蜜柚视频在线观看全集免费观看 | 国产精品免费小视频 | 日本十八禁无遮拦啪啪漫画 | 一本道色综合手机久久 | 色吧最新网址 | 999久久久无码国产精蜜柚 | 邻家美姨在线观看全集免费 | 一本道在线综合久久88 | 国产精品久久久久久精品... | 国产免费毛片在线观看 | 蜜桃成人在线 | 里番※琉璃全彩acg奈亚子 | 国产免费人成在线视频有码 | 国产精品自产拍在线观看网站 | 果冻传媒在线看免费高清 | 免费精品国偷自产在线在线 | 国产精品2020观看久久 | 亚洲第一页视频 | 国产第81页 | 狠狠操天天操夜夜操 | 久久精品在现线观看免费15 | 恋夜影院支持安卓视频美女 | 国产剧果冻传媒星空在线观看 | 伊人影院中文字幕 | 欧美日韩中文字幕综合图区 | 欧美精品高潮呻吟AV久久 | 无限资源在线观看高清 | 在线看片福利无码网址 | 国产精品无码视频一区二区 | 多肉np一女多男高h爽文现代 | 亚洲国产第一区二区三区 | 影音先锋av丝袜天堂 | 年轻漂亮的妺妺中文字幕版 | 成年人视频免费在线播放 |