捕获未处理的Promise错误方法


Posted in Javascript onOctober 13, 2017

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

使用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错误方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS支持带x身份证号码验证函数
Aug 10 Javascript
jquery iframe操作详细解析
Nov 20 Javascript
JS+CSS实现精美的二级导航效果代码
Sep 17 Javascript
BootStrap按钮标签及基本样式
Nov 23 Javascript
BootStrap Fileinput初始化时的一些参数
Dec 30 Javascript
angularjs中回车键触发某一事件的方法
Apr 24 Javascript
vue-cli+webpack在生成的项目中使用bootstrap实例代码
May 26 Javascript
vue 使用Jade模板写html,stylus写css的方法
Feb 23 Javascript
Vue 父子组件的数据传递、修改和更新方法
Mar 01 Javascript
如何用JavaScript实现功能齐全的单链表详解
Feb 11 Javascript
深入了解JavaScript 的 WebAssembly
Jun 15 Javascript
Vue源码分析之Vue实例初始化详解
Aug 25 Javascript
解决ie img标签内存泄漏的问题
Oct 13 #Javascript
jq源码解析之绑在$,jQuery上面的方法(实例讲解)
Oct 13 #jQuery
vue2组件之select2调用的示例代码
Oct 12 #Javascript
vue2.x select2 指令封装详解
Oct 12 #Javascript
一个简易时钟效果js实现代码
Mar 25 #Javascript
微信小程序实现页面跳转传值的方法
Oct 12 #Javascript
微信小程序 页面滑动事件的实例详解
Oct 12 #Javascript
You might like
ob_start(),ob_start('ob_gzhandler')使用
2006/12/25 PHP
实现dedecms全站URL静态化改造的代码
2007/03/29 PHP
php function用法如何递归及return和echo区别
2014/03/07 PHP
php判断文件夹是否存在不存在则创建
2015/04/09 PHP
PHP7新特性foreach 修改示例介绍
2016/08/26 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
2020/03/02 PHP
Thinkphp5框架中引入Markdown编辑器操作示例
2020/06/03 PHP
javascript dom 基本操作小结
2010/04/11 Javascript
修复IE9&safari 的sort方法
2011/10/21 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
JQEasy-ui在IE9以下版本中二次加载的问题分析及处理方法
2014/06/23 Javascript
一个小例子解释如何来阻止Jquery事件冒泡
2014/07/17 Javascript
Node.js 利用cheerio制作简单的网页爬虫示例
2018/03/01 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
微信开发之微信jssdk录音功能开发示例
2018/10/22 Javascript
微信小程序基于picker实现级联菜单
2019/02/15 Javascript
Layui 数据表格批量删除和多条件搜索的实例
2019/09/04 Javascript
vue实现百度语音合成的实例讲解
2019/10/14 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
Python中的包和模块实例
2014/11/22 Python
python如何在循环引用中管理内存
2018/03/20 Python
python3下载抖音视频的完整代码
2019/06/05 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
详解python 条件语句和while循环的实例代码
2020/12/28 Python
C#的几个面试问题
2016/05/22 面试题
移风易俗倡议书
2014/04/15 职场文书
中学生爱国演讲稿
2014/09/05 职场文书
开展批评与自我批评心得体会
2014/10/17 职场文书
物业工程部岗位职责
2015/02/11 职场文书
物业保洁员岗位职责
2015/02/13 职场文书
道歉信范文
2015/05/12 职场文书
离职信范文
2015/06/23 职场文书
学校运动会通讯稿
2015/07/18 职场文书
考生诚信考试承诺书(2016版)
2016/03/25 职场文书
Python+腾讯云服务器实现每日自动健康打卡
2021/12/06 Python