全面介紹javascript異常處理
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…語法有以下三種形式
|
|
|
如果有一定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的語法很簡單,如下
其中的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 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句柄會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相關的錯誤。