摘要:中的傳統做法假設代碼塊執行拋出錯誤,那么捕獲該錯誤的寫法為代碼塊執行,并拋出錯誤定時器我們先來針對上面的代碼改寫一下,加入一個定時器。像這樣,將扔在定時器的外面,是無法捕獲到內部的錯誤的。
ES5 中的傳統做法
假設代碼塊執行拋出錯誤 fail,那么捕獲該錯誤的寫法為:
try { // 代碼塊執行,并拋出 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 扔在定時器的外面,是無法捕獲到內部的錯誤的。
正確的做法應該是:
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); });
這樣寫是沒有問題的,錯誤能夠被捕獲到。但只要稍微修改一下,可能就出現問題了。比如:
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
另外,還有一個比較有意思的細節,在 catch 之后繼續添加 .then 會被繼續執行。
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 給下面的方法繼續執行 }).then((x) => { console.log("continue:", x); }); // fail: fail // continue: undefinedAsync/Await
本質上來講, Async/Await 是通過 Promise 實現,所以基本跟上面 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
但這里就有一個問題,比如函數需要有返回,那么返回的語句就需要寫兩次,正常但時候返回結果,錯誤的時候,返回一個 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; // 默認值 }); console.log("success:", result); })(); // fail: fail // success: 0
在錯誤捕獲到之后,重新分配一個默認值,讓代碼繼續運行。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/88576.html
捕獲或指定要求 有效的Java編程語言代碼必須遵守捕獲或指定需求,這意味著可能拋出某些異常的代碼必須包含以下任一項: 捕獲異常的try語句,try必須為異常提供處理程序,如捕獲和處理異常中所述。 一種方法,指定它可以拋出異常,該方法必須提供一個throws子句,列出異常,如通過方法拋出指定異常中所述。 不符合捕獲或指定要求的代碼將無法編譯。 并非所有異常都受捕獲或指定要求的約束,為了理解原因,...
摘要:組成指針,指針代表捕獲異常的范圍,就是的范圍。當觸發異常的字節碼的索引值在某個異常表條目的監控范圍內,虛擬機會判斷所拋出的異常和該條目想要捕獲的異常是否匹配。 Java異常知識 1.異常的兩大關鍵因素 (1)拋出異常1.顯式:應用程序手動拋出異常。具體就是使用throw拋出異常2.隱式:Java虛擬機對于無法執行的代碼,自動拋出異常(2)捕獲異常1.try 代碼塊:用來標記需要進行異常...
摘要:但如果忽視異常輕則影響功能運行,重則導致系統崩潰,造成經濟損失。異常處理捕獲異常捕獲關鍵字與一致,都是使用。語句塊表示無論是否發生異常,語句塊代碼一定會被執行。 不少前端工程師看到這個標題可能會產生質問: 我js用得好好的,能后端能APP,為什么還要學習Python? 至少有下面兩個理由: 學習曲線。ES6之后的JavaScript(TypeScript)的在語法上和Python有很...
摘要:另外這樣的異常捕獲不能捕獲的異常錯誤信息,這點需要注意。最終大致的流程圖如下結語前端異常捕獲與上報是前端異常監控的前提,了解并做好了異常數據的收集和分析才能實現一個完善的錯誤響應和處理機制,最終達成數據可視化。 關于 微信公眾號:前端呼啦圈(Love-FED) 我的博客:勞卜的博客 知乎專欄:前端呼啦圈 前言 Hello,大家好,又與大家見面了,這次給大家分享下前端異常監控中需...
摘要:二需要處理哪些異常對于前端來說,我們可做的異常捕獲還真不少。總結一下,大概如下語法錯誤代碼異常請求異常靜態資源加載異常異常異??缬虮罎⒑涂D下面我會針對每種具體情況來說明如何處理這些異常。 前端一直是距離用戶最近的一層,隨著產品的日益完善,我們會更加注重用戶體驗,而前端異常卻如鯁在喉,甚是煩人。一、為什么要處理異常?異常是不可控的,會影響最終的呈現結果,但是我們有充分的理由去做這樣的事...
閱讀 2555·2023-04-26 00:57
閱讀 925·2021-11-25 09:43
閱讀 2231·2021-11-11 16:55
閱讀 2246·2019-08-30 15:53
閱讀 3607·2019-08-30 15:52
閱讀 1473·2019-08-30 14:10
閱讀 3391·2019-08-30 13:22
閱讀 1223·2019-08-29 11:18