從研究try catch 捕獲不到異步錯誤談談學習方法的問題


  做了剛新網站 姜瑞濤的官方網站

 

    先看下面的代碼,思考一下輸出

        try {
            throw new Error(3)

        } catch (e) {
            console.log(e)
        }



        try {
            setTimeout(function () {
                throw new Error(5)
            }, 100)

        } catch (e) {
            console.log(e)
        }

  在瀏覽器是分別輸出Error: 3(正常打印出錯誤實例,未報錯)和 Uncaught Error: 5(一個未捕獲錯誤)

然后思考為何第二塊代碼未捕獲到錯誤。自己目前的思考是try和catch是在當前調用棧里,遇到setTimeout的時候,把里面的回調函數放在了任務隊列里了,try結束未發現異常也就不執行catch了,當調用棧執行結束,開始任務隊列里的代碼,這個時候拋出了錯誤,但已經沒有接受此錯誤的地方了,因此報錯。

接下來,去社區找相關資料,找到這篇文章 駁《慎用 try catch》   文章寫得不錯,如下代碼

setTimeout(()=> {
  throw new Error('can you catch me!!!');
})

無論使用什么方式,都無法捕獲異常。歸根結底這是代碼編寫的問題,而非 try/catch 的問題。要捕獲到異常,必須在throw new Error的直接外出用try catch包起來才行。下面思考Promise是如何捕獲到異常的

    var promise = new Promise(function (resolve, reject) {
      throw new Error(5)
    })
    promise.then(v => console.log(v), e => console.log(e))

上面的代碼確實捕獲到異常了,是如何捕獲到的呢?在Promise的實現代碼里,我們把回調函數包裹在try里了,所以捕獲的到了。

最后引出最近新的學習方法思考,尤其是被網上錯誤的二手資料誤導的問題。學習編程,不僅僅要看文章,還要動手實踐。CSS可以在自己電腦上實驗布局和屬性,以來可以確認資料是否有問題,二來加深印象。JS也是如此,多動手實踐代碼,不要完全詳細網上的知識。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM