资讯专栏INFORMATION COLUMN

捕获未处理的Promise错误

HackerShell / 3120人阅读

摘要:的错误监控插件监听了事件,因此可以自动捕获未处理错误。自从年双十一正式上线,累计处理了亿错误事件,付费客户有金山软件百姓网等众多品牌企业。

译者按: 通过监听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", (reason, promise) => ···);

示例代码:

process.on("unhandledRejection", reason =>
{
    console.log(reason); // 打印"Hello, Fundebug!"
});

function foo()
{
    Promise.reject("Hello, Fundebug!");
}

foo();

注: Node.js v6.6.0+ 默认会报告未处理的Promise错误,因此不去监听unhandledrejection事件也没问题。

Fundebug的Node.js错误监控插件监听了unhandledRejection事件,因此可以自动捕获未处理Promise错误。

参考

Promise Rejection Events Sample

Event: "unhandledRejection"

关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java线上应用实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了10亿+错误事件,付费客户有Google、360、金山软件、百姓网等众多品牌企业。欢迎大家免费试用!

版权声明

转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/10/09/unhandled-pomise-rejection/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89113.html

相关文章

  • 【笔记】你不知道JS读书笔记——Promise

    摘要:写在前面这一章的顺序对于未接触过使用过的童鞋而言略抽象了,前边几章主要为了说明和之前的异步方式相比有什么优势和它能解决什么问题,后边才详解的设计和各种场景下如何使用。建议先了解和简单使用过后再阅读,效果更佳。 写在前面:Promise这一章的顺序对于未接触过使用过Promise的童鞋而言略抽象了,前边几章主要为了说明Promise和之前的异步方式相比有什么优势和它能解决什么问题,后边才...

    mumumu 评论0 收藏0
  • 【ES6脚丫系列】Promise

    摘要:三种状态进行中已完成,又称已失败。如果的状态是,那么的回调函数就会等待的状态改变,在此之前不会有结果。等价于例子例子的概念是实例的别名,用于指定发生错误时的回调函数。 『ES6知识点总结』变量的解构赋值 本文主要内容如下:1 Promise是什么?1.1 特点:1.2 三种状态:1.3 用处:1.4 Promise缺点:1.5 历史过程2 生成promise实例3 pr...

    BoYang 评论0 收藏0
  • 前端魔法堂——异常不仅仅是try/catch

    摘要:我打算分成前端魔法堂异常不仅仅是和前端魔法堂调用栈,异常实例中的宝藏两篇分别叙述内置自定义异常类,捕获运行时异常语法异常网络请求异常事件,什么是调用栈和如何获取调用栈的相关信息。 前言  编程时我们往往拿到的是业务流程正确的业务说明文档或规范,但实际开发中却布满荆棘和例外情况,而这些例外中包含业务用例的例外,也包含技术上的例外。对于业务用例的例外我们别无它法,必须要求实施人员与用户共同...

    bladefury 评论0 收藏0
  • promise学习笔记

    摘要:第一个回调函数完成以后,会将返回结果作为参数,传入第二个回调函数。采用链式的,可以指定一组按照次序调用的回调函数。这时,第二个方法指定的回调函数,就会等待这个新的对象状态发生变化。方法是的别名,用于指定发生错误时的回调函数。 本文我是在学习阮一峰老师的ECMAScript 6 入门的Promise章节时,为了加深记忆,通篇都是照抄原文的。原文地址:阮一峰ECMAScipt入门 1.Pr...

    mykurisu 评论0 收藏0
  • promise

    摘要:是一个对象,它的内部其实有三种状态。已拒绝的异步操作未成功结束。方法则是将对象的状态改变为失败,同时将错误的信息传递到后续错误处理的操作。在第二个中拿到数据并且捕获。使用的写法比一般的写法更加清晰明确。 ## 前言 今天来分享下promise的用法,es6伟大发明之一,当初我学习的时候也是蛮头大的,不知道为啥,整个脑子就是,我在哪,我要干啥的懵圈,后面认真学习之后,觉得真是十分好用,下...

    jay_tian 评论0 收藏0

发表评论

0条评论

HackerShell

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<