国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

異常捕獲

boredream / 374人閱讀

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

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

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

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

我們先來針對上面的代碼改寫一下,加入一個定時器。

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

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

正確的做法應(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);
  });

這樣寫是沒有問題的,錯誤能夠被捕獲到。但只要稍微修改一下,可能就出現(xià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);
  });

這里拋出但錯誤將不能被捕獲。所以,在 Promise 中,我們一般通過 reject 來拋出錯誤。

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

另外,還有一個比較有意思的細(xì)節(jié),在 catch 之后繼續(xù)添加 .then 會被繼續(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ì)上來講, Async/Await 是通過 Promise 實現(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

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

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

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

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/88576.html

相關(guān)文章

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

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

    wanglu1209 評論0 收藏0
  • JVM如何捕獲異常

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

    liukai90 評論0 收藏0
  • 從JavaScript到Python之異常

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

    xcold 評論0 收藏0
  • 談?wù)勄岸?em>異常捕獲與上報

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

    Kosmos 評論0 收藏0
  • PHP 錯誤與異常

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

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

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

    zoomdong 評論0 收藏0

發(fā)表評論

0條評論

boredream

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<