文章目錄
- try catch finally 語句說明
- throw語句說明
- Error對象
- Javascript的異常處理機制和window.onerror控制代碼
JavaScript中的異常可以用try..catch..finally語句來處理,也可以手動的來拋出異常。
1.使用try..catch..finally語句來處理異常
js代碼在執行過程中如果出現異常,會手動建立一個異常類對象,該異常類對象將被提交給瀏覽器,這個過程稱為“拋出異常”。當瀏覽器接收到一場對象時,會尋找能處理這一異常的代碼並把當前異常對象提交給其處理,這一過程被稱為“捕獲異常”。try..catch..finally語句的基本文法格式為:
複製代碼 代碼如下:try{//可能拋出異常的代碼
}catch(error){//如果發生異常會執行的代碼,error為發生的異常類對象
}finally{//無條件執行的代碼
}
在上面的語句中,catch語句緊跟在try語句的後面,finally語句緊跟在catch的後面,這是一個完整的異常處理語句的寫法。其實,catch語句和finally語句都可以省略的,但是二者至少要保留其中之一和try語句結合使用。
在try塊中的語句並不一定是要拋出異常的語句,任何JavaScript語句都可以使用異常處理語句來處理,但這樣做沒有必要。當try塊中某一行的代碼拋出了異常,則該行下方的代碼將不會被執行,轉而直接執行catch塊的代碼。
在catch塊中,catch語句後面括弧中的error表示捕獲到的異常對象執行個體,該執行個體包含異常的詳細資料,可以根據這些資訊作出適當的處理。如果catch語句後還有finally語句,則繼續執行finally塊中的語句。
finally塊中的語句是始終被執行的語句,塊中的語句通常做一些最後的清理工作。如果在執行finally塊之前,遇到return語句、continue語句或break語句等轉移流程的語句時,那麼在執行這些語句前finally塊中的代碼也要被執行。
如果在一個異常處理語句中,只包含try..finally語句而沒有補貨異常的catch語句則執行try塊中的語句後會直接執行finally塊的語句,最後再將異常拋出。
例: 複製代碼 代碼如下:<script>
try{
var date=new Date();
date.test();//調用date的未定義的test方法;
document.wrire("try塊執行結束<br>");
}catch(error){
with(document){
write("出現了異常<br>");
write("異常類型:"+error.name+"<br>");
write("異常訊息:"+error.message);
}
}finally{
document.write("異常處理完畢!");
}
</script>
結果:
出現了異常
異常類型:TypeError
異常訊息:對象不支援此屬性或方法異常處理完畢!
2.手動拋出異常
除了發生運行時瀏覽器會拋出異常,開發人員也可以自己動手拋出異常。手動異常拋出的語句是throw,其基本文法格式為:
throw expression;
try catch finally 語句說明
try catch finally是javascript語言提供的異常處理機制。文法結構如下
try { //這段代碼從上往下運行,其中任何一個語句拋出異常該代碼塊就結束運行
}catch (e) { // 如果try代碼塊中拋出了異常,catch代碼塊中的代碼就會被執行。 //e是一個局部變數,用來指向Error對象或者其他拋出的對象}finally {
//無論try中代碼是否有異常拋出(甚至是try代碼塊中有return語句),finally代碼塊中始終會被執行。 }
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中代碼拋出異常以後就是先執行catch中的代碼,然後執行finally中的代碼。如果沒有catch語句,try中的代碼拋出異常後,就會先執行finally中的語句,然後將try中拋出的異常以異常的方式繼續往上拋。
不管try代碼塊的執行時如何被終止的(出現異常、return、自然終止)finally中的語句始終會被執行,正是由於finally的這種特性,通常finally用來執行一些清理工作。如果try中代碼是以return,continue,break的方式終止的,Javascript引擎會在執行完finally中的語句以後再執行相應的try中的返回語句。
throw語句說明
throw語句在javascript1.4中已經實現。try的文法很簡單,如下
throw expression;
其中的expression可以是任何一種類型,也就是說throw “There is a error” 或是throw 1001都是正確的。但通常我們會拋出一個Error對象或是Error對象的子類。關於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中實現的。Error的建構函式有兩種
new Error( )
new Error(message )
Error有兩個基本的屬性name和message。message用來表示異常的詳細資料。而name指的的是Error對象的建構函式。此外,不同的js引擎對Error還各自提供了一些擴充,例如mozilla提供了fileName(異常出現的檔案名稱)和linenumber(異常出現的行號)的擴充,而IE提供了number(錯誤號碼)的支援。不過name和message是兩個基本的屬性,在firefox和ie中都能夠支援。Javascript中Error還有幾個子類
EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError,各自的意思就不在這裡詳細描述了,讀者可以在我提供的參考文檔中找到相應的參考。
Javascript的異常處理機制和window.onerror控制代碼
當javascript代碼中出現錯誤的時候,js引擎就會根據js的調用棧逐級尋找對應的catch,如果沒有找到相應的catch handler或catch handler本身又有error或者又拋出新的error,最後就會把這個error的處理交給瀏覽器,瀏覽器會用各自不同的方式(IE以黃色三角圖案顯示在左下角,而firefix會顯示在錯誤控制台中)顯示錯誤資訊給訪問者。很多情境下,我們會覺得這種錯誤提示方式不夠友好,而且提示資訊很隱蔽,那麼我們機會自訂這種錯誤提示的方式嗎?答案是有,就是window.onerror屬性。
javascript的window對象有一個特別的屬性onerror,如果你將某個function賦值給window的onerror屬性,那麼但凡這個window中有javascript錯誤出現,該function都會被調用,也就是說這個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個參數分別是錯誤資訊提示,產生錯誤的javascript的document ulr,錯誤出現的行號。
onerroe控制代碼的傳回值也很重要,如果控制代碼返回true,表示瀏覽器無需在對該錯誤做額外的處理,也就是說瀏覽器不需要再顯示錯誤資訊。而如果返回的是false,瀏覽器還是會提示錯誤資訊。
window.onerror=function(){
alert(”xx”);
return true; //如果注釋掉該語句,瀏覽器中還是會有錯誤提示,反之則沒有。
}
function throwerror(){
throw new Error(”cc”);
}
我們在開發HTML的過程中避免不了一些Js的異常,通常我們也不可能依賴客戶開啟瀏覽器的錯誤提示框(如)來為我們定位bug提供線索,而利用window.onerror控制代碼我們就可以講錯誤提示資訊顯示出來,客戶只要在錯誤出現的時候,提供相應的截屏就可以了,這點可以很好的協助開發人員定位,分析javascript相關的錯誤。
參考資料
Mozilla Javascript1.5核心參考
Javascript犀牛(JavaScript: The Definitive Guide)