javascript 異常處理使用總結(jié)
1.使用try..catch..finally語(yǔ)句來(lái)處理異常
js代碼在執(zhí)行過(guò)程中如果出現(xiàn)異常,會(huì)手動(dòng)創(chuàng)建一個(gè)異常類(lèi)對(duì)象,該異常類(lèi)對(duì)象將被提交給瀏覽器,這個(gè)過(guò)程稱(chēng)為“拋出異?!薄.?dāng)瀏覽器接收到一場(chǎng)對(duì)象時(shí),會(huì)尋找能處理這一異常的代碼并把當(dāng)前異常對(duì)象提交給其處理,這一過(guò)程被稱(chēng)為“捕獲異?!?。try..catch..finally語(yǔ)句的基本語(yǔ)法格式為:
try{//可能拋出異常的代碼
}catch(error){//如果發(fā)生異常會(huì)執(zhí)行的代碼,error為發(fā)生的異常類(lèi)對(duì)象
}finally{//無(wú)條件執(zhí)行的代碼
}
在上面的語(yǔ)句中,catch語(yǔ)句緊跟在try語(yǔ)句的后面,finally語(yǔ)句緊跟在catch的后面,這是一個(gè)完整的異常處理語(yǔ)句的寫(xiě)法。其實(shí),catch語(yǔ)句和finally語(yǔ)句都可以省略的,但是二者至少要保留其中之一和try語(yǔ)句結(jié)合使用。
在try塊中的語(yǔ)句并不一定是要拋出異常的語(yǔ)句,任何JavaScript語(yǔ)句都可以使用異常處理語(yǔ)句來(lái)處理,但這樣做沒(méi)有必要。當(dāng)try塊中某一行的代碼拋出了異常,則該行下方的代碼將不會(huì)被執(zhí)行,轉(zhuǎn)而直接執(zhí)行catch塊的代碼。
在catch塊中,catch語(yǔ)句后面括號(hào)中的error表示捕獲到的異常對(duì)象實(shí)例,該實(shí)例包含異常的詳細(xì)信息,可以根據(jù)這些信息作出適當(dāng)?shù)奶幚怼H绻鹀atch語(yǔ)句后還有finally語(yǔ)句,則繼續(xù)執(zhí)行finally塊中的語(yǔ)句。
finally塊中的語(yǔ)句是始終被執(zhí)行的語(yǔ)句,塊中的語(yǔ)句通常做一些最后的清理工作。如果在執(zhí)行finally塊之前,遇到return語(yǔ)句、continue語(yǔ)句或break語(yǔ)句等轉(zhuǎn)移流程的語(yǔ)句時(shí),那么在執(zhí)行這些語(yǔ)句前finally塊中的代碼也要被執(zhí)行。
如果在一個(gè)異常處理語(yǔ)句中,只包含try..finally語(yǔ)句而沒(méi)有補(bǔ)貨異常的catch語(yǔ)句則執(zhí)行try塊中的語(yǔ)句后會(huì)直接執(zhí)行finally塊的語(yǔ)句,最后再將異常拋出。
例:
<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("異常類(lèi)型:"+error.name+"<br>");
write("異常消息:"+error.message);
}
}finally{
document.write("異常處理完畢!");
}
</script>
結(jié)果:
出現(xiàn)了異常
異常類(lèi)型:TypeError
異常消息:對(duì)象不支持此屬性或方法異常處理完畢!
2.手動(dòng)拋出異常
除了發(fā)生運(yùn)行時(shí)瀏覽器會(huì)拋出異常,開(kāi)發(fā)人員也可以自己動(dòng)手拋出異常。手動(dòng)異常拋出的語(yǔ)句是throw,其基本語(yǔ)法格式為:
throw expression;
try catch finally 語(yǔ)句說(shuō)明
try catch finally是javascript語(yǔ)言提供的異常處理機(jī)制。語(yǔ)法結(jié)構(gòu)如下
try { //這段代碼從上往下運(yùn)行,其中任何一個(gè)語(yǔ)句拋出異常該代碼塊就結(jié)束運(yùn)行} catch (e) { // 如果try代碼塊中拋出了異常,catch代碼塊中的代碼就會(huì)被執(zhí)行。 //e是一個(gè)局部變量,用來(lái)指向Error對(duì)象或者其他拋出的對(duì)象 } finally {//無(wú)論try中代碼是否有異常拋出(甚至是try代碼塊中有return語(yǔ)句),finally代碼塊中始終會(huì)被執(zhí)行。 }
try…catch…finally…語(yǔ)法中除了try以外catch和finally都是可選的(兩者必須要有一個(gè)),也就是說(shuō)try…catch…finally…語(yǔ)法有以下三種形式
|
|
|
如果有一定catch,一旦try中代碼拋出異常以后就是先執(zhí)行catch中的代碼,然后執(zhí)行finally中的代碼。如果沒(méi)有catch語(yǔ)句,try中的代碼拋出異常后,就會(huì)先執(zhí)行finally中的語(yǔ)句,然后將try中拋出的異常以異常的方式繼續(xù)往上拋。
不管try代碼塊的執(zhí)行時(shí)如何被終止的(出現(xiàn)異常、return、自然終止)finally中的語(yǔ)句始終會(huì)被執(zhí)行,正是由于finally的這種特性,通常finally用來(lái)執(zhí)行一些清理工作。如果try中代碼是以return,continue,break的方式終止的,Javascript引擎會(huì)在執(zhí)行完finally中的語(yǔ)句以后再執(zhí)行相應(yīng)的try中的返回語(yǔ)句。
throw語(yǔ)句說(shuō)明
throw語(yǔ)句在javascript1.4中已經(jīng)實(shí)現(xiàn)。try的語(yǔ)法很簡(jiǎn)單,如下
throw expression;
其中的expression可以是任何一種類(lèi)型,也就是說(shuō)throw “There is a error” 或是throw 1001都是正確的。但通常我們會(huì)拋出一個(gè)Error對(duì)象或是Error對(duì)象的子類(lèi)。關(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對(duì)象
Error對(duì)象和它的子類(lèi)是在javascript1.5中實(shí)現(xiàn)的。Error的構(gòu)造函數(shù)有兩種
new Error( )new Error(message )
Error有兩個(gè)基本的屬性name和message。message用來(lái)表示異常的詳細(xì)信息。而name指的的是Error對(duì)象的構(gòu)造函數(shù)。此外,不同的js引擎對(duì)Error還各自提供了一些擴(kuò)展,例如mozilla提供了fileName(異常出現(xiàn)的文件名稱(chēng))和linenumber(異常出現(xiàn)的行號(hào))的擴(kuò)展,而IE提供了number(錯(cuò)誤號(hào))的支持。不過(guò)name和message是兩個(gè)基本的屬性,在firefox和ie中都能夠支持。Javascript中Error還有幾個(gè)子類(lèi)EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError,各自的意思就不在這里詳細(xì)描述了,讀者可以在我提供的參考文檔中找到相應(yīng)的參考。
Javascript的異常處理機(jī)制和window.onerror句柄
當(dāng)javascript代碼中出現(xiàn)錯(cuò)誤的時(shí)候,js引擎就會(huì)根據(jù)js的調(diào)用棧逐級(jí)尋找對(duì)應(yīng)的catch,如果沒(méi)有找到相應(yīng)的catch handler或catch handler本身又有error或者又拋出新的error,最后就會(huì)把這個(gè)error的處理交給瀏覽器,瀏覽器會(huì)用各自不同的方式(IE以黃色三角圖案顯示在左下角,而firefix會(huì)顯示在錯(cuò)誤控制臺(tái)中)顯示錯(cuò)誤信息給訪問(wèn)者。很多場(chǎng)景下,我們會(huì)覺(jué)得這種錯(cuò)誤提示方式不夠友好,而且提示信息很隱蔽,那么我們機(jī)會(huì)自定義這種錯(cuò)誤提示的方式嗎?答案是有,就是window.onerror屬性。
javascript的window對(duì)象有一個(gè)特別的屬性onerror,如果你將某個(gè)function賦值給window的onerror屬性,那么但凡這個(gè)window中有javascript錯(cuò)誤出現(xiàn),該function都會(huì)被調(diào)用,也就是說(shuō)這個(gè)function會(huì)成為這個(gè)window的錯(cuò)誤處理句柄。
// Display error messages in a dialog box, but never more than 3
window.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句柄會(huì)3個(gè)參數(shù)分別是錯(cuò)誤信息提示,產(chǎn)生錯(cuò)誤的javascript的document ulr,錯(cuò)誤出現(xiàn)的行號(hào)。
onerroe句柄的返回值也很重要,如果句柄返回true,表示瀏覽器無(wú)需在對(duì)該錯(cuò)誤做額外的處理,也就是說(shuō)瀏覽器不需要再顯示錯(cuò)誤信息。而如果返回的是false,瀏覽器還是會(huì)提示錯(cuò)誤信息。
window.onerror=function(){
alert(”xx”);
return true; //如果注釋掉該語(yǔ)句,瀏覽器中還是會(huì)有錯(cuò)誤提示,反之則沒(méi)有。
}
function throwerror(){
throw new Error(”cc”);
}
我們?cè)陂_(kāi)發(fā)HTML的過(guò)程中避免不了一些Js的異常,通常我們也不可能依賴(lài)客戶(hù)打開(kāi)瀏覽器的錯(cuò)誤提示框(如上圖)來(lái)為我們定位bug提供線索,而利用window.onerror句柄我們就可以講錯(cuò)誤提示信息顯示出來(lái),客戶(hù)只要在錯(cuò)誤出現(xiàn)的時(shí)候,提供相應(yīng)的截屏就可以了,這點(diǎn)可以很好的幫助開(kāi)發(fā)人員定位,分析javascript相關(guān)的錯(cuò)誤。
參考資料
相關(guān)文章
英文首字母全大寫(xiě)的js實(shí)現(xiàn)腳本
輸入內(nèi)容活直接點(diǎn)轉(zhuǎn)換即可,講單詞的首字母大寫(xiě)。2008-09-09
bootstrap table支持高度百分比的實(shí)例代碼
這篇文章給大家介紹了bootstrap table支持高度百分比的實(shí)例代碼,通過(guò)更改BootstrapTable.prototype.resetView 方法,以支持高度百分比定義,適應(yīng)不同高度屏幕,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-02-02
javascript設(shè)計(jì)模式之module(模塊)模式
這篇文章主要為大家詳細(xì)介紹了javascript設(shè)計(jì)模式之module(模塊)模式 ,感興趣的小伙伴們可以參考一下2016-08-08
DOM和XMLHttpRequest對(duì)象的屬性和方法整理
DOM和XMLHttpRequest對(duì)象的屬性和方法整理,注意是方便操作ajax的朋友2012-01-01
JS中Iframe之間傳值及子頁(yè)面與父頁(yè)面應(yīng)用
用iframe做系統(tǒng)框架,相信很多朋友都有這樣的經(jīng)歷吧,接下來(lái)將為你詳細(xì)介紹下JS中Iframe之間傳值應(yīng)用,感興趣的你可以參考下哈,希望可以幫助到你2013-03-03
完美解決JS文件頁(yè)面加載時(shí)的阻塞問(wèn)題
下面小編就為大家?guī)?lái)一篇完美解決JS文件頁(yè)面加載時(shí)的阻塞問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
JS組件Bootstrap實(shí)現(xiàn)彈出框效果代碼
這篇文章主要介紹了JS組件Bootstrap實(shí)現(xiàn)彈出框效果代碼的相關(guān)資料,對(duì)彈出框感興趣的小伙伴們可以參考一下2016-04-04
JS跨域之window.name實(shí)現(xiàn)的跨域數(shù)據(jù)傳輸
這篇文章主要介紹了JS跨域之window.name實(shí)現(xiàn)的跨域數(shù)據(jù)傳輸,需要的朋友可以參考下2022-01-01

