摘要:中的傳統(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: undefinedAsync/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
捕獲或指定要求 有效的Java編程語(yǔ)言代碼必須遵守捕獲或指定需求,這意味著可能拋出某些異常的代碼必須包含以下任一項(xiàng): 捕獲異常的try語(yǔ)句,try必須為異常提供處理程序,如捕獲和處理異常中所述。 一種方法,指定它可以拋出異常,該方法必須提供一個(gè)throws子句,列出異常,如通過(guò)方法拋出指定異常中所述。 不符合捕獲或指定要求的代碼將無(wú)法編譯。 并非所有異常都受捕獲或指定要求的約束,為了理解原因,...
摘要:組成指針,指針代表捕獲異常的范圍,就是的范圍。當(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)行異常...
摘要:但如果忽視異常輕則影響功能運(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有很...
摘要:另外這樣的異常捕獲不能捕獲的異常錯(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)控中需...
摘要:但異常捕獲后程序可以繼續(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ù)的...
摘要:二需要處理哪些異常對(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é)果,但是我們有充分的理由去做這樣的事...
閱讀 2553·2023-04-26 00:57
閱讀 924·2021-11-25 09:43
閱讀 2228·2021-11-11 16:55
閱讀 2241·2019-08-30 15:53
閱讀 3604·2019-08-30 15:52
閱讀 1471·2019-08-30 14:10
閱讀 3388·2019-08-30 13:22
閱讀 1221·2019-08-29 11:18