javascript:理解try...catch...finally

之前,我一直喜歡用console.log(do some thing)去執行輸出的類型和值,想立刻看到彈出的信息,就會直接在瀏覽器alert()一下,這些是基礎知識。數組

稍微複雜一點點,就要用到判斷語句,if else進行條件判斷,話說if條件else不然,這樣的判斷對於寫程序代碼的碼儂已是很是熟悉不過了。瀏覽器

若是你以爲這個也很簡單,可能會用到混合if else條件判斷語句加上try catch 來處理語句,雖然用try catch能處理任何的對象,經過throw扔一條有錯誤的語句,接着catch拋出該對象或者該對象的錯誤,今天咱們只說try...catch,下面的例子分別拋出數組、時間、原型函數、數字類型等。函數

function trycatch () {
    var array = [234],
        newdate = new Date(),
        fun = function(){},
        is = 12.22,
        call;
    try{
        throw array + '\n' + newdate.toLocaleString() + ' \n' + fun.prototype.constructor + 
        '\n' + (typeof is == 'number') +' \n' + call ; //當心local後面還有一個'e'
    }
    catch(e){
        console.log(e);
    }
    finally{
        console.log('err finally');
    }
}
trycatch () 
// 輸出:
// 234 // 2015/10/12 下午10:07:03 // function (){} // true // undefined

更準確的說,try內放一條可能產生錯誤的語句。當try語句開始執行並拋出錯誤時,catch才執行內部的語句和對應的try內的錯誤信息message。什麼時候執行finally語句,只有當try語句和catch語句執行以後,才執行finally語句,不論try拋出異常或者catch捕獲都會執行finally語句。spa

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的幾個輸出演示代碼:prototype

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。code

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的語句:blog

function trycatch () {
    try{
        // 
    }
    catch(e){
        console.log('err finally');
        return console.log('new finally')
    }
}
trycatch ()
// 空(viod)
// 空(viod)

結果就輸出都爲空。// 空(viod)。由於try沒有扔出錯誤,因此catch沒有捕獲到異常,故輸出結果就爲空。ip

那麼咱們再看看下面這個案例,經過下面的例子,可能會讓你更加地瞭解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塊裏的代碼也能夠拋出異常),都將會被「外部」塊所捕獲。

 

 

參考資料:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/try...catch

參考資料:https://msdn.microsoft.com/library/4yahc5d8(v=vs.94).aspx

相關文章
相關標籤/搜索