javascript:理解try...catch...finally
以前,我一直喜歡用console.log(do some thing)去執行輸出的類型和值,想馬上看到彈出的資訊,就會直接在瀏覽器alert()一下,這些是基礎知識。稍微複雜一點點,就要用到判斷語句,if else進行條件判斷,話說if條件else否則,這樣的判斷對於寫程式碼的碼儂已經是非常熟悉不過了。如果你覺得這個也很簡單,可能會用到混合if else條件判斷語句加上try catch 來處理語句,雖然用try catch能處理任何的對象,通過throw扔一條有錯誤的語句,接著catch拋出該對象或者該對象的錯誤,今天我們只說try...catch,下面的例子分別拋出數組、時間、原型函數、數字類型等。 array = [234= = = 12.22 array + '\n' + newdate.toLocaleString() + ' \n' + fun.prototype.constructor + '\n' + ( is == 'number') +' \n' + call ; 'err finally'更準確的說,try內放一條可能產生錯誤的語句。當try語句開始執行並拋出錯誤時,catch才執行內部的語句和對應的try內的錯誤資訊message。何時執行finally語句,只有當try語句和catch語句執行之後,才執行finally語句,不論try拋出異常或者catch捕獲都會執行finally語句。function trycatch () { try{ throw new Error('koringz'); } catch(e){ console.log(e.message); } finally{ console.log('err finally'); }}trycatch ()// 輸出:// koringz// err finally通過try扔出一條錯誤的語句,我們看到在catch捕獲到一條錯誤的的資訊// koringz,但是同樣的finally也輸出了// err finally。雖然我們瞭解try catch工作流程的處理方式,但是並不瞭解finally塊的代碼處理常式,按照以往我們對finally語句一貫的思維方式,就是finally輸出不受try和catch的限制和約束。以下是finally的幾個輸出示範代碼:function trycatch () { try{ throw new Error('koringz'); } finally{ console.log('err finally'); return console.log('new finally') }}trycatch ()// err finally// new finally如上所示,try扔一條錯誤的語句,finally輸出的結果是: // err finally // new finally。function trycatch () { try{ throw new Error('koringz'); } catch(e){ console.log('err finally'); return console.log('new finally') }}trycatch ()// err finally// new finally如上所示,try扔一條錯誤的語句,catch捕獲到錯誤輸出結果同上finally。 // err finally // new finally。當我修改try的語句:function trycatch () { try{ // } catch(e){ console.log('err finally'); return console.log('new finally') }}trycatch ()// 空(viod)// 空(viod)結果就輸出都為空白。// 空(viod)。因為try沒有扔出錯誤,所以catch沒有捕獲到異常,故輸出結果就為空白。那麼我們再看看下面這個案例,通過下面的例子,可能會讓你更加地瞭解try catch語句的異常處理。try{ try{ throw new Error('open'); } catch(e){ console.info(e.message); throw e } finally{ console.log('finally'); }}catch(e){ console.log('op',e.message);}// open// finally// op open當我們在try可能引發錯誤的代碼塊內嵌套try catch,通過嵌套的代碼塊try內扔一條可能出現錯誤的語句 throw new Error('open');,緊接著嵌套的try將錯誤傳遞給嵌套的catch處理,最終通過嵌套的finally運行過後,我們看到最後一條結果// op open,其實嵌套的catch捕獲的錯誤資訊扔給最外層catch捕獲的。// op open也就是說:任何給定的異常只會被離它最近的封閉catch塊捕獲一次。當然,在"內部"塊拋出的任何新異常(因為catch塊裡的代碼也可以拋出異常),都將會被“外部”塊所捕獲。