专栏名称: Fundebug
Fundebug为JavaScript、微信小程序及Node.js开发团队提供专业的线上代码bug监控和智能分析服务。
目录
相关文章推荐
前端早读课  ·  【早阅】始终将你的估算值乘以π ·  10 小时前  
前端大全  ·  10年了,开发人员仍然不明白 ... ·  昨天  
前端大全  ·  前端行情变了,差别真的挺大。。。 ·  3 天前  
前端早读课  ·  【开源】TinyEngine开启新篇章,服务 ... ·  3 天前  
51好读  ›  专栏  ›  Fundebug

捕获未处理的Promise错误

Fundebug  · 公众号  · 前端  · 2017-10-12 09:18

正文

译者按: 通过监听 unhandledrejection 事件,可以捕获未处理的Promise错误。

  • 原文: Tracking unhandled rejected Promises

  • 译者: Fundebug

为了保证可读性,本文采用意译而非直译,并且对源代码进行了大量修改。另外,本文版权归原作者所有,翻译仅用于学习。

使用 Promise 编写异步代码时,使用 reject 来处理错误。有时,开发者通常会忽略这一点,导致一些错误没有得到处理。例如:


function main() {

asyncFunc()

.then(···)

.then(() => console.log('Done!'));

}


由于没有使用 catch 方法捕获错误,当 asyncFunc() 函数 reject 时,抛出的错误则没有被处理。

这篇博客将分别介绍在浏览器与Node.js中,如何捕获那些未处理的Promise错误。

浏览器中未处理的Promise错误

一些浏览器(例如Chrome)能够捕获未处理的Promise错误。

unhandledrejection

监听 unhandledrejection 事件,即可捕获到未处理的Promise错误:


window.addEventListener('unhandledrejection', event => ···);


这个事件是 PromiseRejectionEvent 实例,它有2个最重要的属性:

  • 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错误监控插件监听了 unhandledrejection 事件,因此可以自动捕获未处理Promise错误。

rejectionhandled

当一个Promise错误最初未被处理,但是稍后又得到了处理,则会触发 rejectionhandled 事件:


window.addEventListener('rejectionhandled', event => ···);


这个事件是 PromiseRejectionEvent 实例。

示例代码:


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错误

监听 unhandledRejection 事件,即可捕获到未处理的Promise错误:


process.on('unhandledRejection'







请到「今天看啥」查看全文