捕获未处理的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 相关文章推荐
发现的以前不知道的函数
Sep 19 Javascript
use jscript Create a SQL Server database
Jun 16 Javascript
一些相见恨晚的 JavaScript 技巧
Apr 25 Javascript
jQuery数据显示插件整合实现代码
Oct 24 Javascript
在HTML中插入JavaScript代码的示例
Jun 03 Javascript
javascript实现点击单选按钮链接转向对应网址的方法
Aug 12 Javascript
全面解析Bootstrap图片轮播效果
Dec 03 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
Jun 07 Javascript
用jQuery向div中添加Html文本内容的简单实现
Jul 13 Javascript
js 毫秒转天时分秒的实例
Nov 17 Javascript
JS代码优化的8点建议
Feb 04 Javascript
vue在线动态切换主题色方案
Mar 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
晶体管来复再生式二管收音机
2021/03/02 无线电
PHP性能优化 产生高度优化代码
2011/07/22 PHP
php 团购折扣计算公式
2011/11/24 PHP
PHP函数篇之掌握ord()与chr()函数应用
2011/12/05 PHP
PHP打开和关闭文件操作函数总结
2014/11/18 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
Laravel框架实现多个视图共享相同数据的方法详解
2019/07/09 PHP
Google 静态地图API实现代码
2010/11/19 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2012/01/21 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
2012/09/26 Javascript
用jQuery实现一些导航条切换,显示隐藏的实例代码
2013/06/08 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
再次谈论React.js实现原生js拖拽效果引起的一系列问题
2016/04/03 Javascript
详解JavaScript的数据类型以及数据类型的转换
2019/04/20 Javascript
JS中封装axios来管控api的2种方式
2019/09/11 Javascript
layui table 复选框跳页后再回来保持原来选中的状态示例
2019/10/26 Javascript
微信公众号网页分享功能开发的示例代码
2020/05/27 Javascript
JavaScript 声明私有变量的两种方式
2021/02/05 Javascript
视觉直观感受若干常用排序算法
2017/04/13 Python
python实现在函数中修改变量值的方法
2019/07/16 Python
python 默认参数相关知识详解
2019/09/18 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
2020/09/01 Python
Python 中Operator模块的使用
2021/01/30 Python
思想品德自我鉴定
2013/10/12 职场文书
大学生职业生涯设计书
2014/01/02 职场文书
《蓝色的树叶》教学反思
2014/02/24 职场文书
党的群众路线教育实践活动个人对照检查材料(公安)
2014/11/05 职场文书
幼师求职自荐信
2015/03/26 职场文书
埃及王子观后感
2015/06/16 职场文书
python解决12306登录验证码的实现
2021/04/18 Python
python for循环赋值问题
2021/06/03 Python
nginx日志格式分析和修改
2022/04/28 Servers
Windows11 Insider Preview Build 25206今日发布 更新内容汇总
2022/09/23 数码科技