try/catch/finally語句

try/catch/finally語句是javascript的異常處理機制。其中try從句定義了須要處理的異常所在的代碼塊。catch從句跟隨在try從句以後,當try塊內某處發生了異常時,調用catch內的代碼邏輯。catch從句後跟隨finally塊,後者中放置着清理代碼。無論try塊中是否產生異常,finally塊內的邏輯老是會執行。javascript

try{java

//一般來說,這裏的代碼會從頭執行到尾而不產生任何問題;對象

//但有時會拋出一個異常,要麼是由throw語句直接拋出異常,要麼是經過調用一個方法間接拋出異常ip

}io

catch(e){function

//當且僅當try語句塊拋出異常,纔會執行這裏的代碼變量

//這裏能夠經過局部變量e來得到對Error對象或者拋出的其餘值得引用引用

//這裏的代碼塊能夠基於某種緣由處理這個異常,也能夠忽略這個異常程序

//還能夠經過throw語句從新拋出異常方法

}

finally{

//無論try語句是否拋出了異常,這裏的邏輯總會執行,終止try語句塊的方式有:

// 1) 正常終止,執行完語句塊的最後一條語句

// 2) 經過break、continue或return語句終止

// 3) 拋出一個異常,異常被catch從句捕獲

// 4) 拋出一個異常,異常未被捕獲,繼續向上傳播

}

這裏有個關於try/catch語句更實際的例子

try{

 var n=Number(prompt("請輸入一個正整數",""));

var f=factorial(n);

alert( n+" !=" +f);

}

catch(ex){

alert(ex); //若是輸入不合法,將執行這裏的邏輯

}

一般狀況下,解釋器執行到try塊的尾部,而後開始執行finally的邏輯,一遍進行必要的清理工做。當因爲return、continue或break語句使得解釋器跳出try語句塊時,解釋器在執行新的目標代碼以前先執行finally塊中的邏輯。

若是在try語句塊中產生了異常,並且存在一條與之相關的catch從句處理這個異常,解釋器首先會執行catch中的邏輯,而後執行finally中的邏輯。若是不存在處理異常的局部catch從句,解釋器會首先執行finally中的邏輯,而後向上傳播這個異常,直到找到能處理這個異常的catch從句。

若是finally塊中使用了return、break或continue、throw語句使程序發生跳轉,或者經過調用了拋出異常的方法改變了程序的執行流程,無論這個跳轉使程序掛起仍是繼續執行,解釋器都會將其忽略。例如,若是finally從句拋出一個異常,這個異常將代替正在拋出的異常。若是finally從句運行到了return語句,儘管已經拋出了異常且這個拋出的異常尚未處理,這個方法依然正常返回。

var foo = function(){

  try{

  //拋出一個異常

     }

  finally{

    return 1; // 未處理異常直接返回,這裏將正常返回

    }

}

相關文章
相關標籤/搜索