捕获未处理的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 相关文章推荐
iframe 父窗口和子窗口相互的调用方法集锦
Dec 15 Javascript
jquery $.each()使用探讨
Sep 23 Javascript
jquery中使用循环下拉菜单示例代码
Sep 24 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
Jan 05 Javascript
Bootstrap入门书籍之(一)排版
Feb 17 Javascript
JavaScript编程学习技巧汇总
Feb 21 Javascript
在AngularJS框架中处理数据建模的方式解析
Mar 05 Javascript
JavaScript利用正则表达式替换字符串中的内容
Dec 12 Javascript
JavaScript组件开发之输入框加候选框
Mar 10 Javascript
MUI 上拉刷新/下拉加载功能实例代码
Apr 13 Javascript
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
May 20 jQuery
Vuerouter的beforeEach与afterEach钩子函数的区别
Dec 26 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
php中switch与ifelse的效率区别及适用情况分析
2015/02/12 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
2017/02/17 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
php根据命令行参数生成配置文件详解
2019/03/15 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
javascript attachEvent绑定多个事件执行顺序问题
2010/10/20 Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
2012/08/14 Javascript
javascript中比较字符串是否相等的方法
2013/07/23 Javascript
JQuery设置文本框和密码框得到焦点时的样式
2013/08/30 Javascript
微信小程序-拍照或选择图片并上传文件
2017/01/06 Javascript
jquery在vue脚手架中的使用方式示例
2017/08/29 jQuery
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置
2018/11/02 Javascript
Vue实现简易翻页效果源码分享
2018/11/08 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
javascript头像上传代码实例
2019/09/28 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
[01:10]DOTA2次级职业联赛 - Fly战队宣传片
2014/12/01 DOTA
深入理解Django中内置的用户认证
2017/10/06 Python
Python模块搜索路径代码详解
2018/01/29 Python
python实现验证码识别功能
2018/06/07 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
浅谈Pandas:Series和DataFrame间的算术元素
2018/12/22 Python
解决tensorboard多个events文件显示紊乱的问题
2020/02/15 Python
selenium如何定位span元素的实现
2021/01/13 Python
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
HTML5的结构和语义(5):内嵌媒体
2008/10/17 HTML / CSS
TCP/IP模型的分界线
2012/12/01 面试题
怎么样写好简历中的自我评价
2013/10/25 职场文书
物流仓储计划书
2014/01/10 职场文书
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
《老人与海鸥》教学反思
2016/02/16 职场文书
pytorch--之halfTensor的使用详解
2021/05/24 Python