做了剛新網站 姜瑞濤的官方網站
先看下面的代碼,思考一下輸出
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也是如此,多動手實踐代碼,不要完全詳細網上的知識。