成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

異常捕獲

boredream / 382人閱讀

摘要:中的傳統(tǒng)做法假設(shè)代碼塊執(zhí)行拋出錯(cuò)誤,那么捕獲該錯(cuò)誤的寫法為代碼塊執(zhí)行,并拋出錯(cuò)誤定時(shí)器我們先來(lái)針對(duì)上面的代碼改寫一下,加入一個(gè)定時(shí)器。像這樣,將扔在定時(shí)器的外面,是無(wú)法捕獲到內(nèi)部的錯(cuò)誤的。

ES5 中的傳統(tǒng)做法

假設(shè)代碼塊執(zhí)行拋出錯(cuò)誤 fail,那么捕獲該錯(cuò)誤的寫法為:

try {
  // 代碼塊執(zhí)行,并拋出 fail 錯(cuò)誤
  throw new Error("fail");
} catch (e) {
  console.log(e);
}
定時(shí)器

我們先來(lái)針對(duì)上面的代碼改寫一下,加入一個(gè)定時(shí)器。

try {
  setTimeout(()=>{
    throw new Error("fail");
    // Uncaught Error: fail
     }, 1000);
} catch (e) {
  console.log(e);
}

像這樣,將 try/catch 扔在定時(shí)器的外面,是無(wú)法捕獲到內(nèi)部的錯(cuò)誤的。

正確的做法應(yīng)該是:

 setTimeout(()=>{
  try{
    throw new Error("fail");
  } catch (e) {
    console.log(e);
  }
},1000);
Promise
function doSomething() {
  return new Promise((resolve, reject) => {
    // 同步代碼中的 throw 可以被捕捉到
    throw new Error("fail");
  });
}

doSomething()
  .then((x) => {
    console.log("success:", x);
  })
  .catch((err) => {
    console.log("fail:", err);
  });

這樣寫是沒(méi)有問(wèn)題的,錯(cuò)誤能夠被捕獲到。但只要稍微修改一下,可能就出現(xiàn)問(wèn)題了。比如:

function doSomething() {
  return new Promise((resolve, reject) => {
    // 異步代碼中的 throw 不能被 Promise 的 catch 捕捉到
    setTimeout(() => {
      throw new Error("fail");
    }, 1000);
  });
}

doSomething()
  .then((x) => {
    console.log("success:", x);
  })
  .catch((err) => {
    console.log("fail:", err);
  });

這里拋出但錯(cuò)誤將不能被捕獲。所以,在 Promise 中,我們一般通過(guò) reject 來(lái)拋出錯(cuò)誤。

function doSomething(x) {
  return new Promise((resolve, reject) => reject(x));
}

doSomething("fail").then((x) => {
  console.log("success:", x);
}).catch((err) => {
  console.log("fail:", err);
});
// fail: fail

另外,還有一個(gè)比較有意思的細(xì)節(jié),在 catch 之后繼續(xù)添加 .then 會(huì)被繼續(xù)執(zhí)行。

function doSomething(x) {
  return new Promise((resolve, reject) => reject(x));
}

doSomething("fail").then((x) => {
  console.log("success:", x);
}).catch((err) => {
  console.log("fail:", err);
  // 這里可以寫 return 給下面的方法繼續(xù)執(zhí)行
}).then((x) => {
  console.log("continue:", x);
});
// fail: fail
// continue: undefined
Async/Await

本質(zhì)上來(lái)講, Async/Await 是通過(guò) Promise 實(shí)現(xiàn),所以基本跟上面 Promise 所講的差不多。

可以在 await 方法外嵌套 try/catch,類似這樣:

function doSomething(x) {
  return new Promise((resolve, reject) => reject(x));
}

(async () => {
  try {
    const result = await doSomething("fail");
    console.log("success:", result);
    // return 返回
  } catch (err) {
    console.log("fail:", err);
    // return 返回
  }
})();
// fail: fail

但這里就有一個(gè)問(wèn)題,比如函數(shù)需要有返回,那么返回的語(yǔ)句就需要寫兩次,正常但時(shí)候返回結(jié)果,錯(cuò)誤的時(shí)候,返回一個(gè) throw new Error() 或者其他的。有一個(gè)小的竅門,可以這樣寫:

function doSomething(x) {
  return new Promise((resolve, reject) => reject(x));
}

(async () => {
  const result = await doSomething("fail").catch((err) => {
    console.log("fail:", err);
    return 0; // 默認(rèn)值
  });
  console.log("success:", result);
})();
// fail: fail
// success: 0

在錯(cuò)誤捕獲到之后,重新分配一個(gè)默認(rèn)值,讓代碼繼續(xù)運(yùn)行。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/88576.html

相關(guān)文章

  • Java? 教程(捕獲或指定要求)

    捕獲或指定要求 有效的Java編程語(yǔ)言代碼必須遵守捕獲或指定需求,這意味著可能拋出某些異常的代碼必須包含以下任一項(xiàng): 捕獲異常的try語(yǔ)句,try必須為異常提供處理程序,如捕獲和處理異常中所述。 一種方法,指定它可以拋出異常,該方法必須提供一個(gè)throws子句,列出異常,如通過(guò)方法拋出指定異常中所述。 不符合捕獲或指定要求的代碼將無(wú)法編譯。 并非所有異常都受捕獲或指定要求的約束,為了理解原因,...

    wanglu1209 評(píng)論0 收藏0
  • JVM如何捕獲異常

    摘要:組成指針,指針代表捕獲異常的范圍,就是的范圍。當(dāng)觸發(fā)異常的字節(jié)碼的索引值在某個(gè)異常表?xiàng)l目的監(jiān)控范圍內(nèi),虛擬機(jī)會(huì)判斷所拋出的異常和該條目想要捕獲的異常是否匹配。 Java異常知識(shí) 1.異常的兩大關(guān)鍵因素 (1)拋出異常1.顯式:應(yīng)用程序手動(dòng)拋出異常。具體就是使用throw拋出異常2.隱式:Java虛擬機(jī)對(duì)于無(wú)法執(zhí)行的代碼,自動(dòng)拋出異常(2)捕獲異常1.try 代碼塊:用來(lái)標(biāo)記需要進(jìn)行異常...

    liukai90 評(píng)論0 收藏0
  • 從JavaScript到Python之異常

    摘要:但如果忽視異常輕則影響功能運(yùn)行,重則導(dǎo)致系統(tǒng)崩潰,造成經(jīng)濟(jì)損失。異常處理捕獲異常捕獲關(guān)鍵字與一致,都是使用。語(yǔ)句塊表示無(wú)論是否發(fā)生異常,語(yǔ)句塊代碼一定會(huì)被執(zhí)行。 不少前端工程師看到這個(gè)標(biāo)題可能會(huì)產(chǎn)生質(zhì)問(wèn): 我js用得好好的,能后端能APP,為什么還要學(xué)習(xí)Python? 至少有下面兩個(gè)理由: 學(xué)習(xí)曲線。ES6之后的JavaScript(TypeScript)的在語(yǔ)法上和Python有很...

    xcold 評(píng)論0 收藏0
  • 談?wù)勄岸?em>異常捕獲與上報(bào)

    摘要:另外這樣的異常捕獲不能捕獲的異常錯(cuò)誤信息,這點(diǎn)需要注意。最終大致的流程圖如下結(jié)語(yǔ)前端異常捕獲與上報(bào)是前端異常監(jiān)控的前提,了解并做好了異常數(shù)據(jù)的收集和分析才能實(shí)現(xiàn)一個(gè)完善的錯(cuò)誤響應(yīng)和處理機(jī)制,最終達(dá)成數(shù)據(jù)可視化。 關(guān)于 微信公眾號(hào):前端呼啦圈(Love-FED) 我的博客:勞卜的博客 知乎專欄:前端呼啦圈 前言 Hello,大家好,又與大家見(jiàn)面了,這次給大家分享下前端異常監(jiān)控中需...

    Kosmos 評(píng)論0 收藏0
  • PHP 錯(cuò)誤與異常

    摘要:但異常捕獲后程序可以繼續(xù)執(zhí)行,而真正的錯(cuò)誤出現(xiàn)后程序就必須終止異??梢允褂脕?lái)捕獲捕獲,捕獲之后后續(xù)代碼可以繼續(xù)執(zhí)行而錯(cuò)誤是無(wú)法使用捕獲的如果拋出了異常,就必須捕獲它否則程序終止執(zhí)行。 PHP錯(cuò)誤級(jí)別 Parse error > Fatal Error > Waning > Notice > Deprecated Deprecated 最低級(jí)別的錯(cuò)誤(不推薦,不建議)使用一些過(guò)期函數(shù)的...

    longmon 評(píng)論0 收藏0
  • 如何優(yōu)雅處理前端的異常

    摘要:二需要處理哪些異常對(duì)于前端來(lái)說(shuō),我們可做的異常捕獲還真不少??偨Y(jié)一下,大概如下語(yǔ)法錯(cuò)誤代碼異常請(qǐng)求異常靜態(tài)資源加載異常異常異??缬虮罎⒑涂D下面我會(huì)針對(duì)每種具體情況來(lái)說(shuō)明如何處理這些異常。 前端一直是距離用戶最近的一層,隨著產(chǎn)品的日益完善,我們會(huì)更加注重用戶體驗(yàn),而前端異常卻如鯁在喉,甚是煩人。一、為什么要處理異常?異常是不可控的,會(huì)影響最終的呈現(xiàn)結(jié)果,但是我們有充分的理由去做這樣的事...

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

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

0條評(píng)論

boredream

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<