成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

慎用try catch

lvzishen / 3216人閱讀

摘要:捕獲不到異步錯(cuò)誤嘗試對(duì)異步方法進(jìn)行操作只能捕獲當(dāng)次事件循環(huán)內(nèi)的異常,對(duì)執(zhí)行時(shí)拋出的異常將無能為力。這里并不能捕獲回調(diào)里面拋出的異常異步情況想捕獲異常,建議在異步函數(shù)里包一層。前端可以用在上傳圖片使用別人的庫報(bào)錯(cuò)同步調(diào)接口等地方適用。

前言

自從ECMA-262第3版引入了try catch語句,作為JavaScript中處理異常的一種標(biāo)準(zhǔn)方式。基本的語法如下所示。

一、try catch基本語法
try {
    //可能會(huì)導(dǎo)致錯(cuò)誤的代碼
} catch (error) {
    //在錯(cuò)誤發(fā)生時(shí)怎么處理
}finally {
     //即使報(bào)錯(cuò)始終執(zhí)行
 }
二、try catch特點(diǎn)
1.try catch耗性能
1.1 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.

根據(jù)上面ECMAScript文檔的13.15.513.15.6`。

下面僅為本妹子自己的翻譯理解,僅供參考

上面大概說運(yùn)行try catch時(shí),需要將當(dāng)前的詞法環(huán)境和作用域全部分別添加到catchFinally所要執(zhí)行的代碼塊中。從上可以推斷出try catch是消耗性能的。

1.2 try catch耗性能實(shí)驗(yàn)

下面我用Chrome62IE9分別添加多個(gè)try catch,進(jìn)行對(duì)比實(shí)驗(yàn),雖然,很想拋棄萬惡的IE,但是很多國內(nèi)的產(chǎn)品不答應(yīng)呀,除非我們?nèi)ソ∩矸吭俣嗑毦?,打一架,嘿嘿~?br>1.2.1 實(shí)驗(yàn)數(shù)據(jù):

//沒有加try catch
(function () {
  var i = 0;
     i++;
}())
//有try catch
(function () {
  var i = 0;
    try {
      i++;
    } catch (ex) {
    } finally {
    }
}())

1.2.2 實(shí)驗(yàn)結(jié)果:

1.2.3 實(shí)驗(yàn)鏈接:

https://jsperf.com/test-try-catch3

https://jsperf.com/test-try-catch

上面實(shí)驗(yàn)數(shù)據(jù)對(duì)比得知,try catch會(huì)消耗性能,但是try catch對(duì)Chrome的影響比IE11小很多,據(jù)說是V8引擎新的編譯器TurboFan 起到的作用,有興趣的小伙伴們可以看下v8_8h_source的3354行起,但是IE11是slower不少的。這就根據(jù)小伙伴們的業(yè)務(wù)對(duì)象了,如果只面向現(xiàn)代瀏覽器,try catch消耗性能影響會(huì)很?。蝗绻枰嫒?b>IE或內(nèi)嵌在低端的webView時(shí),可適當(dāng)考慮下try catch消耗性能。

2.try catch捕獲不到異步錯(cuò)誤

嘗試對(duì)異步方法進(jìn)行try catch操作只能捕獲當(dāng)次事件循環(huán)內(nèi)的異常,對(duì)callback執(zhí)行時(shí)拋出的異常將無能為力。

try {
    setTimeout(()=>{
        const A = 1
        A = 2
    },0)
} catch (err) {
    // 這里并不能捕獲回調(diào)里面拋出的異常
    console.log("-----catch error------")
    console.log(err)
}

異步情況想捕獲異常,建議在異步函數(shù)里包一層try catch。

setTimeout(() => {
  try {
    const A = 1
    A = 2
  } catch (err) {
    console.log(err)
  }
}, 0)
3.try catch拋出錯(cuò)誤

try-catch 語句相配的還有一個(gè) throw 操作符,隨時(shí)拋出自定義錯(cuò)誤,可以根據(jù)不同錯(cuò)誤類型,創(chuàng)建自定義錯(cuò)誤消息。

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.");

如果覺得自定義的報(bào)錯(cuò)不合理,想看原生報(bào)錯(cuò),可以使用ChromePause on exceptions功能

三、慎用try catch

try catch最適合處理那些我們無法控制的錯(cuò)誤,如I/O操作等,后端nodeJsjava讀取I/O操作比較多比如讀數(shù)據(jù)庫,所以用try catch比較多。前端可以用在上傳圖片、使用別人的js庫報(bào)錯(cuò)、async await同步調(diào)接口等地方適用。

async function f() {
  try {
    await Promise.reject("出錯(cuò)了");
  } catch(e) {
  }
  return await Promise.resolve("hello world");
}

但是大部分前端客戶端代碼處理都不怎么依賴環(huán)境也沒有I/O操作,都是自己寫的代碼,在明明白白地知道自己的代碼會(huì)發(fā)生錯(cuò)誤時(shí),再使用try catch語句就不太合適了,對(duì)應(yīng)數(shù)據(jù)類型的錯(cuò)誤,建議小伙伴們用解構(gòu)賦值指定默認(rèn)值、&&||來規(guī)避,所以慎用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 .. :)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/100675.html

相關(guān)文章

  • 慎用ThreadLocal

    摘要:另載于是個(gè)很爽的東西,線程安全,能當(dāng)全局變量來用別。第一家公司,使用框架老技術(shù),現(xiàn)代人可以理解為類似,對(duì)每個(gè)請(qǐng)求都套上,進(jìn)入時(shí)把寫入,返回或拋?zhàn)⒁鈺r(shí)清理。第二家公司,某次引入一個(gè)設(shè)計(jì),也用了來傳遞上下文信息,有的地方?jīng)]能清掉。 另載于 http://www.qingjingjie.com/blogs/12 ThreadLocal是個(gè)很爽的東西,線程安全,能當(dāng)全局變量來用(別!)。 上一...

    harriszh 評(píng)論0 收藏0
  • Java性能優(yōu)化-慎用異常

    摘要:當(dāng)創(chuàng)建一個(gè)異常時(shí),需要收集一個(gè)棧跟蹤,這個(gè)棧跟蹤用于描述異常是在何處創(chuàng)建的。招致性能損失的并不是操作盡管在沒有預(yù)先創(chuàng)建異常的情況下就拋出異常是有點(diǎn)不尋常。異常是為異常的情況而設(shè)計(jì)的,使用時(shí)也應(yīng)該牢記這一原則。 當(dāng)創(chuàng)建一個(gè)異常時(shí),需要收集一個(gè)棧跟蹤(stack track),這個(gè)棧跟蹤用于描述異常是在何處創(chuàng)建的。構(gòu)建這些棧跟蹤時(shí)需要為運(yùn)行時(shí)棧做一份快照,正是這一部分開銷很大。 當(dāng)需要?jiǎng)?chuàng)建...

    hufeng 評(píng)論0 收藏0
  • 高性能JavaScript閱讀簡記(一)

    摘要:對(duì)于直接量和局部變量的訪問性能差異微不足道,性能消耗代價(jià)高一些的是全局變量數(shù)組項(xiàng)對(duì)象成員。當(dāng)一個(gè)函數(shù)被創(chuàng)建后,作用域鏈中被放入可訪問的對(duì)象。同樣會(huì)改變作用域鏈,帶來性能問題。 早前閱讀高性能JavaScript一書所做筆記。 一、Loading and Execution 加載和運(yùn)行 從加載和運(yùn)行角度優(yōu)化,源于JavaScript運(yùn)行會(huì)阻塞UI更新,JavaScript腳本的下載、解析...

    sorra 評(píng)論0 收藏0
  • 高性能JavaScript閱讀簡記(一)

    摘要:對(duì)于直接量和局部變量的訪問性能差異微不足道,性能消耗代價(jià)高一些的是全局變量數(shù)組項(xiàng)對(duì)象成員。當(dāng)一個(gè)函數(shù)被創(chuàng)建后,作用域鏈中被放入可訪問的對(duì)象。同樣會(huì)改變作用域鏈,帶來性能問題。 早前閱讀高性能JavaScript一書所做筆記。 一、Loading and Execution 加載和運(yùn)行 從加載和運(yùn)行角度優(yōu)化,源于JavaScript運(yùn)行會(huì)阻塞UI更新,JavaScript腳本的下載、解析...

    zhangrxiang 評(píng)論0 收藏0
  • Java反射的封裝

    摘要:每次看到很多人使用原生的反射接口,我心里都在想,愚蠢的人類啊,為什么不封裝一下再用。幸運(yùn)的是類的封裝已經(jīng)幫你實(shí)現(xiàn)了。 Java這種以啰嗦著稱的編程語言,反射代碼也很啰嗦。每次看到很多人使用原生的反射接口,我心里都在想,愚蠢的人類啊,為什么不封裝一下再用。 能用到反射的場(chǎng)景 不能靜態(tài)決定,比如根據(jù)URL參數(shù)的字符串調(diào)用相應(yīng)方法的時(shí)候。 避免樣板代碼的時(shí)候,例如可以用反射代替,繁瑣的JS...

    raledong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<