摘要:中的傳統(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: undefinedAsync/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
捕獲或指定要求 有效的Java編程語言代碼必須遵守捕獲或指定需求,這意味著可能拋出某些異常的代碼必須包含以下任一項: 捕獲異常的try語句,try必須為異常提供處理程序,如捕獲和處理異常中所述。 一種方法,指定它可以拋出異常,該方法必須提供一個throws子句,列出異常,如通過方法拋出指定異常中所述。 不符合捕獲或指定要求的代碼將無法編譯。 并非所有異常都受捕獲或指定要求的約束,為了理解原因,...
摘要:組成指針,指針代表捕獲異常的范圍,就是的范圍。當(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)行異常...
摘要:但如果忽視異常輕則影響功能運行,重則導(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有很...
摘要:另外這樣的異常捕獲不能捕獲的異常錯誤信息,這點需要注意。最終大致的流程圖如下結(jié)語前端異常捕獲與上報是前端異常監(jiān)控的前提,了解并做好了異常數(shù)據(jù)的收集和分析才能實現(xiàn)一個完善的錯誤響應(yīng)和處理機(jī)制,最終達(dá)成數(shù)據(jù)可視化。 關(guān)于 微信公眾號:前端呼啦圈(Love-FED) 我的博客:勞卜的博客 知乎專欄:前端呼啦圈 前言 Hello,大家好,又與大家見面了,這次給大家分享下前端異常監(jiān)控中需...
摘要:二需要處理哪些異常對于前端來說,我們可做的異常捕獲還真不少。總結(jié)一下,大概如下語法錯誤代碼異常請求異常靜態(tài)資源加載異常異常異??缬虮罎⒑涂D下面我會針對每種具體情況來說明如何處理這些異常。 前端一直是距離用戶最近的一層,隨著產(chǎn)品的日益完善,我們會更加注重用戶體驗,而前端異常卻如鯁在喉,甚是煩人。一、為什么要處理異常?異常是不可控的,會影響最終的呈現(xiàn)結(jié)果,但是我們有充分的理由去做這樣的事...
閱讀 2538·2023-04-26 00:57
閱讀 911·2021-11-25 09:43
閱讀 2221·2021-11-11 16:55
閱讀 2207·2019-08-30 15:53
閱讀 3592·2019-08-30 15:52
閱讀 1459·2019-08-30 14:10
閱讀 3379·2019-08-30 13:22
閱讀 1209·2019-08-29 11:18