摘要:的錯(cuò)誤監(jiān)控插件監(jiān)聽(tīng)了事件,因此可以自動(dòng)捕獲未處理錯(cuò)誤。自從年雙十一正式上線,累計(jì)處理了億錯(cuò)誤事件,付費(fèi)客戶有金山軟件百姓網(wǎng)等眾多品牌企業(yè)。
譯者按: 通過(guò)監(jiān)聽(tīng)unhandledrejection事件,可以捕獲未處理的Promise錯(cuò)誤。
原文: Tracking unhandled rejected Promises
譯者: Fundebug
為了保證可讀性,本文采用意譯而非直譯,并且對(duì)源代碼進(jìn)行了大量修改。另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。
使用Promise編寫(xiě)異步代碼時(shí),使用reject來(lái)處理錯(cuò)誤。有時(shí),開(kāi)發(fā)者通常會(huì)忽略這一點(diǎn),導(dǎo)致一些錯(cuò)誤沒(méi)有得到處理。例如:
function main() { asyncFunc() .then(···) .then(() => console.log("Done!")); }
由于沒(méi)有使用catch方法捕獲錯(cuò)誤,當(dāng)asyncFunc()函數(shù)reject時(shí),拋出的錯(cuò)誤則沒(méi)有被處理。
這篇博客將分別介紹在瀏覽器與Node.js中,如何捕獲那些未處理的Promise錯(cuò)誤。
瀏覽器中未處理的Promise錯(cuò)誤一些瀏覽器(例如Chrome)能夠捕獲未處理的Promise錯(cuò)誤。
unhandledrejection監(jiān)聽(tīng)unhandledrejection事件,即可捕獲到未處理的Promise錯(cuò)誤:
window.addEventListener("unhandledrejection", event => ···);
這個(gè)事件是PromiseRejectionEvent實(shí)例,它有2個(gè)最重要的屬性:
promise: reject的Promise
reason: Promise的reject值
示例代碼:
window.addEventListener("unhandledrejection", event => { console.log(event.reason); // 打印"Hello, Fundebug!" }); function foo() { Promise.reject("Hello, Fundebug!"); } foo();
Fundebug的JavaScript錯(cuò)誤監(jiān)控插件監(jiān)聽(tīng)了unhandledrejection事件,因此可以自動(dòng)捕獲未處理Promise錯(cuò)誤。
rejectionhandled當(dāng)一個(gè)Promise錯(cuò)誤最初未被處理,但是稍后又得到了處理,則會(huì)觸發(fā)rejectionhandled事件:
window.addEventListener("rejectionhandled", event => ···);
這個(gè)事件是PromiseRejectionEvent實(shí)例。
示例代碼:
window.addEventListener("unhandledrejection", event => { console.log(event.reason); // 打印"Hello, Fundebug!" }); window.addEventListener("rejectionhandled", event => { console.log("rejection handled"); // 1秒后打印"rejection handled" }); function foo() { return Promise.reject("Hello, Fundebug!"); } var r = foo(); setTimeout(() => { r.catch(e =>{}); }, 1000);Node.js中未處理的Promise錯(cuò)誤
監(jiān)聽(tīng)unhandledRejection事件,即可捕獲到未處理的Promise錯(cuò)誤:
process.on("unhandledRejection", (reason, promise) => ···);
示例代碼:
process.on("unhandledRejection", reason => { console.log(reason); // 打印"Hello, Fundebug!" }); function foo() { Promise.reject("Hello, Fundebug!"); } foo();
注: Node.js v6.6.0+ 默認(rèn)會(huì)報(bào)告未處理的Promise錯(cuò)誤,因此不去監(jiān)聽(tīng)unhandledrejection事件也沒(méi)問(wèn)題。
Fundebug的Node.js錯(cuò)誤監(jiān)控插件監(jiān)聽(tīng)了unhandledRejection事件,因此可以自動(dòng)捕獲未處理Promise錯(cuò)誤。
參考Promise Rejection Events Sample
Event: "unhandledRejection"
關(guān)于FundebugFundebug專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java線上應(yīng)用實(shí)時(shí)BUG監(jiān)控。 自從2016年雙十一正式上線,F(xiàn)undebug累計(jì)處理了10億+錯(cuò)誤事件,付費(fèi)客戶有Google、360、金山軟件、百姓網(wǎng)等眾多品牌企業(yè)。歡迎大家免費(fèi)試用!
版權(quán)聲明轉(zhuǎn)載時(shí)請(qǐng)注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/10/09/unhandled-pomise-rejection/
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89113.html
摘要:寫(xiě)在前面這一章的順序?qū)τ谖唇佑|過(guò)使用過(guò)的童鞋而言略抽象了,前邊幾章主要為了說(shuō)明和之前的異步方式相比有什么優(yōu)勢(shì)和它能解決什么問(wèn)題,后邊才詳解的設(shè)計(jì)和各種場(chǎng)景下如何使用。建議先了解和簡(jiǎn)單使用過(guò)后再閱讀,效果更佳。 寫(xiě)在前面:Promise這一章的順序?qū)τ谖唇佑|過(guò)使用過(guò)Promise的童鞋而言略抽象了,前邊幾章主要為了說(shuō)明Promise和之前的異步方式相比有什么優(yōu)勢(shì)和它能解決什么問(wèn)題,后邊才...
摘要:三種狀態(tài)進(jìn)行中已完成,又稱已失敗。如果的狀態(tài)是,那么的回調(diào)函數(shù)就會(huì)等待的狀態(tài)改變,在此之前不會(huì)有結(jié)果。等價(jià)于例子例子的概念是實(shí)例的別名,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。 『ES6知識(shí)點(diǎn)總結(jié)』變量的解構(gòu)賦值 本文主要內(nèi)容如下:1 Promise是什么?1.1 特點(diǎn):1.2 三種狀態(tài):1.3 用處:1.4 Promise缺點(diǎn):1.5 歷史過(guò)程2 生成promise實(shí)例3 pr...
摘要:我打算分成前端魔法堂異常不僅僅是和前端魔法堂調(diào)用棧,異常實(shí)例中的寶藏兩篇分別敘述內(nèi)置自定義異常類,捕獲運(yùn)行時(shí)異常語(yǔ)法異常網(wǎng)絡(luò)請(qǐng)求異常事件,什么是調(diào)用棧和如何獲取調(diào)用棧的相關(guān)信息。 前言 ?編程時(shí)我們往往拿到的是業(yè)務(wù)流程正確的業(yè)務(wù)說(shuō)明文檔或規(guī)范,但實(shí)際開(kāi)發(fā)中卻布滿荊棘和例外情況,而這些例外中包含業(yè)務(wù)用例的例外,也包含技術(shù)上的例外。對(duì)于業(yè)務(wù)用例的例外我們別無(wú)它法,必須要求實(shí)施人員與用戶共同...
摘要:第一個(gè)回調(diào)函數(shù)完成以后,會(huì)將返回結(jié)果作為參數(shù),傳入第二個(gè)回調(diào)函數(shù)。采用鏈?zhǔn)降?,可以指定一組按照次序調(diào)用的回調(diào)函數(shù)。這時(shí),第二個(gè)方法指定的回調(diào)函數(shù),就會(huì)等待這個(gè)新的對(duì)象狀態(tài)發(fā)生變化。方法是的別名,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。 本文我是在學(xué)習(xí)阮一峰老師的ECMAScript 6 入門(mén)的Promise章節(jié)時(shí),為了加深記憶,通篇都是照抄原文的。原文地址:阮一峰ECMAScipt入門(mén) 1.Pr...
摘要:是一個(gè)對(duì)象,它的內(nèi)部其實(shí)有三種狀態(tài)。已拒絕的異步操作未成功結(jié)束。方法則是將對(duì)象的狀態(tài)改變?yōu)槭?,同時(shí)將錯(cuò)誤的信息傳遞到后續(xù)錯(cuò)誤處理的操作。在第二個(gè)中拿到數(shù)據(jù)并且捕獲。使用的寫(xiě)法比一般的寫(xiě)法更加清晰明確。 ## 前言 今天來(lái)分享下promise的用法,es6偉大發(fā)明之一,當(dāng)初我學(xué)習(xí)的時(shí)候也是蠻頭大的,不知道為啥,整個(gè)腦子就是,我在哪,我要干啥的懵圈,后面認(rèn)真學(xué)習(xí)之后,覺(jué)得真是十分好用,下...
閱讀 1225·2021-09-26 09:55
閱讀 3191·2019-08-30 15:55
閱讀 965·2019-08-30 15:53
閱讀 2296·2019-08-30 13:59
閱讀 2380·2019-08-29 13:08
閱讀 1107·2019-08-29 12:19
閱讀 3302·2019-08-26 13:41
閱讀 418·2019-08-26 13:24