摘要:捕獲不到異步錯誤嘗試對異步方法進行操作只能捕獲當次事件循環內的異常,對執行時拋出的異常將無能為力。這里并不能捕獲回調里面拋出的異常異步情況想捕獲異常,建議在異步函數里包一層。前端可以用在上傳圖片使用別人的庫報錯同步調接口等地方適用。
前言
自從ECMA-262第3版引入了try catch語句,作為JavaScript中處理異常的一種標準方式。基本的語法如下所示。
一、try catch基本語法try { //可能會導致錯誤的代碼 } catch (error) { //在錯誤發生時怎么處理 }finally { //即使報錯始終執行 }二、try catch特點
ECMAScript 2015 -The try Statement
13.15.5 Static Semantics: VarDeclaredNames
TryStatement : try Block Catch Finally
1.Let names be VarDeclaredNames of Block.
2.Append to names the elements of the VarDeclaredNames of Catch.
3.Append to names the elements of the VarDeclaredNames of Finally.
4.Return names.
13.15.6 Static Semantics: VarScopedDeclarations
TryStatement : try Block Catch Finally
1.Let declarations be VarScopedDeclarations of Block.
2.Append to declarations the elements of the VarScopedDeclarations of Catch.
3.Append to declarations the elements of the VarScopedDeclarations of Finally.
4.Return declarations.
根據上面ECMAScript文檔的13.15.5和13.15.6`。
下面僅為本妹子自己的翻譯理解,僅供參考
上面大概說運行try catch時,需要將當前的詞法環境和作用域全部分別添加到catch和Finally所要執行的代碼塊中。從上可以推斷出try catch是消耗性能的。
下面我用Chrome62和IE9分別添加多個try catch,進行對比實驗,雖然,很想拋棄萬惡的IE,但是很多國內的產品不答應呀,除非我們去健身房再多練練,打一架,嘿嘿~~
1.2.1 實驗數據:
//沒有加try catch (function () { var i = 0; i++; }())
//有try catch (function () { var i = 0; try { i++; } catch (ex) { } finally { } }())
1.2.2 實驗結果:
1.2.3 實驗鏈接:
https://jsperf.com/test-try-catch3
https://jsperf.com/test-try-catch
上面實驗數據對比得知,try catch會消耗性能,但是try catch對Chrome的影響比IE11小很多,據說是V8引擎新的編譯器TurboFan 起到的作用,有興趣的小伙伴們可以看下v8_8h_source的3354行起,但是IE11是slower不少的。這就根據小伙伴們的業務對象了,如果只面向現代瀏覽器,try catch消耗性能影響會很小;如果需要兼容IE或內嵌在低端的webView時,可適當考慮下try catch消耗性能。
嘗試對異步方法進行try catch操作只能捕獲當次事件循環內的異常,對callback執行時拋出的異常將無能為力。
try { setTimeout(()=>{ const A = 1 A = 2 },0) } catch (err) { // 這里并不能捕獲回調里面拋出的異常 console.log("-----catch error------") console.log(err) }
異步情況想捕獲異常,建議在異步函數里包一層try catch。
setTimeout(() => { try { const A = 1 A = 2 } catch (err) { console.log(err) } }, 0)
與 try-catch 語句相配的還有一個 throw 操作符,隨時拋出自定義錯誤,可以根據不同錯誤類型,創建自定義錯誤消息。
throw new Error("Something bad happened."); throw new SyntaxError("I don’t like your syntax."); throw new TypeError("What type of variable do you take me for?"); throw new RangeError("Sorry, you just don’t have the range."); throw new EvalError("That doesn’t evaluate."); throw new URIError("Uri, is that you?"); throw new ReferenceError("You didn’t cite your references properly.");
如果覺得自定義的報錯不合理,想看原生報錯,可以使用Chrome的Pause on exceptions功能
try catch最適合處理那些我們無法控制的錯誤,如I/O操作等,后端nodeJs或java讀取I/O操作比較多比如讀數據庫,所以用try catch比較多。前端可以用在上傳圖片、使用別人的js庫報錯、async await同步調接口等地方適用。
async function f() { try { await Promise.reject("出錯了"); } catch(e) { } return await Promise.resolve("hello world"); }
但是大部分前端客戶端代碼處理都不怎么依賴環境也沒有I/O操作,都是自己寫的代碼,在明明白白地知道自己的代碼會發生錯誤時,再使用try catch語句就不太合適了,對應數據類型的錯誤,建議小伙伴們用解構賦值指定默認值、&&和||來規避,所以慎用try catch。
foo = (obj = {}) => { let obj1 = result || {}; if (obj && obj.code) { console.log("obj.code",obj.code) } }參考資料
https://raoenhui.github.io/js/2018/12/16/tryCatch
ECMAScript 2015 -The try Statement
https://developers.google.com/web/updates/2015/05/automatically-pause-on-any-exception
https://v8docs.nodesource.com/node-0.8/d4/da0/v8_8h_source.html
Happy coding .. :)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/100675.html
摘要:另載于是個很爽的東西,線程安全,能當全局變量來用別。第一家公司,使用框架老技術,現代人可以理解為類似,對每個請求都套上,進入時把寫入,返回或拋注意時清理。第二家公司,某次引入一個設計,也用了來傳遞上下文信息,有的地方沒能清掉。 另載于 http://www.qingjingjie.com/blogs/12 ThreadLocal是個很爽的東西,線程安全,能當全局變量來用(別!)。 上一...
摘要:當創建一個異常時,需要收集一個棧跟蹤,這個棧跟蹤用于描述異常是在何處創建的。招致性能損失的并不是操作盡管在沒有預先創建異常的情況下就拋出異常是有點不尋常。異常是為異常的情況而設計的,使用時也應該牢記這一原則。 當創建一個異常時,需要收集一個棧跟蹤(stack track),這個棧跟蹤用于描述異常是在何處創建的。構建這些棧跟蹤時需要為運行時棧做一份快照,正是這一部分開銷很大。 當需要創建...
摘要:對于直接量和局部變量的訪問性能差異微不足道,性能消耗代價高一些的是全局變量數組項對象成員。當一個函數被創建后,作用域鏈中被放入可訪問的對象。同樣會改變作用域鏈,帶來性能問題。 早前閱讀高性能JavaScript一書所做筆記。 一、Loading and Execution 加載和運行 從加載和運行角度優化,源于JavaScript運行會阻塞UI更新,JavaScript腳本的下載、解析...
摘要:對于直接量和局部變量的訪問性能差異微不足道,性能消耗代價高一些的是全局變量數組項對象成員。當一個函數被創建后,作用域鏈中被放入可訪問的對象。同樣會改變作用域鏈,帶來性能問題。 早前閱讀高性能JavaScript一書所做筆記。 一、Loading and Execution 加載和運行 從加載和運行角度優化,源于JavaScript運行會阻塞UI更新,JavaScript腳本的下載、解析...
閱讀 3046·2023-04-26 02:27
閱讀 2763·2021-11-22 13:54
閱讀 902·2021-11-12 10:36
閱讀 3753·2021-10-09 09:44
閱讀 3178·2021-10-09 09:41
閱讀 1223·2021-09-22 10:02
閱讀 2833·2019-08-30 15:56
閱讀 3106·2019-08-30 11:02