一、问题引入

Promise 在前端中的使用已经非常普遍了,但是许多开发者或许习惯了链式调用却忘了捕获 Promise 的错误了。

例如:

function forgetCatchError () {
async()
.then(() => {
// code..
})
.then(() => console.log('forget catch error!'));
}

上面的示例代码中 async() 中和后续的两个 then 中的代码如果出错或者 reject ,错误没有得到处理。

在没有使用 catch 方法指定错误处理的回调函数,Promise 对象抛出的错误不会传递到外层代码,即不会有任何反应。当promise被 reject 并且错误信息没有被处理的时候,会抛出 unhandledrejection,这个错误不会被 window.onerroraddEventListener("error") 所监听到。

二、try catch

// 示例
async function fn() {
let value = await new Promise((resolve, reject) => {
reject('failure');
});
console.log('do something...');
}
fn()

未使用try catch,导致浏览器报错:一个未捕获的错误

所以在开发过程中,为了保证系统健壮性,或者是为了捕获异步的错误,需要频繁的在 async 函数中添加 try/catch,避免出现示例的情况

注:可以引入插件如babel编译插件(babel-plugin-await-add-trycatch),给全局async await添加 try catch代码块

三、全局监控方法

对 unhandledrejection 事件进行监听即可捕捉到未被 catch 的 Promise 错误。

window.addEventListener("unhandledrejection", err => {
console.log(err.reason) err.preventDefault();
}, false); // 或者
window.onunhandledrejection = function(err) {
console.log(err.reason);
return true;
}

addEventListener 中调用 event 的 preventDefault() 可以让 Promise 的错误不抛送到控制台,在 onunhandledrejection 中则可以使用 return true 来达到相同的效果。

全局监控Promise错误的更多相关文章

  1. 捕获未处理的Promise错误

    译者按: 通过监听unhandledrejection事件,可以捕获未处理的Promise错误. 原文: Tracking unhandled rejected Promises 译者: Fundeb ...

  2. 微信小程序:封装全局的promise异步调用方法

    微信小程序:封装全局的promise异步调用方法 一:封装 function POST(url, params) { let promise = new Promise(function (resol ...

  3. EMS邮箱数据库全局监控设置

    案例任务:监控TestDB01邮箱数据库的所有邮件,监控邮箱为用户"王淑江"的邮箱. 1.EMS全局监控设置 使用PowerShell完成操作:"王淑江"监控T ...

  4. promise错误处理的三种方法

    promise碰到then,也就是resolve或者reject的时候是异步的,所以try...catch对它是没有用的 1.then(resolve,reject);  then方法中第二个回调,是 ...

  5. Promise 错误处理

    Promise 是一个异步返回单个结果的函数或方法 不使用  `catch()` 时,在  `success handler` 里的错误无法被捕捉到 使用  `catch()` 时,在  `succe ...

  6. InnoDB的后台线程(IO线程,master线程,锁监控线程,错误监控线程)和内存(缓冲池,重做日志缓冲池,额外内存池)

    InnoDB有多个内存块,你可以认为这些内存块组成了一个大的内存池,负责如下工作: 维护所有进程/线程需要访问的多个内部数据结构. 缓存磁盘上的数据,方便快速地读取,并且在对磁盘文件的数据进行修改之前 ...

  7. 分享知识-快乐自己:自定义struts2类型转换的全局与局部错误信息。

    遇到类型转换错误的时候(也就是说不能进行类型转换),struts2框架自动生成一条错误信息,并且将该错误信息放到addFieldError里面.我们可以通过配置文件来替换这条由struts2自动生成的 ...

  8. .net mvc 运行监控和错误捕捉

    方法类 /// <summary> /// 运行监控类 /// </summary> [AttributeUsage(AttributeTargets.Class | Attr ...

  9. .net(全局文件,错误页,静态页,IIS配置及防黑)

    添加全局应用程序类. <%@ Application Language="C#" %> <script runat="server"> ...

  10. wpf 全局异常捕捉+错误日志记录+自动创建桌面图标

    /// /// 创建桌面图标 /// public static void CreateShortcutOnDesktop(string LnkName) { String shortcutPath ...

随机推荐

  1. Neural Network模型复杂度之Residual Block - Python实现

    背景介绍 Neural Network之模型复杂度主要取决于优化参数个数与参数变化范围. 优化参数个数可手动调节, 参数变化范围可通过正则化技术加以限制. 本文从优化参数个数出发, 以Residual ...

  2. RabbitMQ管理界面使用之手动送数据

    目录 1. 找到相应的队列, 点击进入详情 2. 找到Publish Message项,填写自定义数据 3. 发送数据 4. 发送成功 5. 接收 1. 找到相应的队列, 点击进入详情 2. 找到Pu ...

  3. hive元起动报错:Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V

    错误原因: 1.系统找不到这个类所在的jar包 2.jar包的版本不一样系统不知道使用哪个. hive启动报错的原因是后者 解决办法: 1.com.google.common.base.Precond ...

  4. MyBatis_03(核心配置文件解析)

    核心配置的文件的"详解" -->(优化,核心配置文件) "核心配置文件的前言": 核心配置文件中的标签必须按照固定的顺序 ---> ("有 ...

  5. git 问题解决

    1. fatal: the remote end hung up unexpectedly git config --global http.postBuffer 104857600 其他方案: gi ...

  6. html入門 如何 區別行級元素 和 塊級元素

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  7. Java除法运算精度问题

    结论:不要将两个int类型的变量直接相除,会出现精度丢失问题,最好将其中一个变量强制转化成浮点型 现象: 两个int类型相除的结果要取整,如果相除得到0.53,那么结果会变成0,出现精度丢失的问题 D ...

  8. ACCESS中查询语句:查询所得数据另存到一个指定目录下的文件夹里,并新建新的文件

    select * into [excel 8.0 database=d:\aa.xls].sheet1 from bb where bb.cc="dd" excel 8.0 为什么 ...

  9. nvim比较两个文件的不同

    vim -d file1 file2 或 vimdiff file1 file2 2. 如果已经打开了文件file1,再打开另一个文件file2进行比较: :vert diffsplit file2 ...

  10. 如何让一个 div 左右各空一定距离然后 div 占满剩下的宽度?

    如何让一个 div 左右各空一定距离然后 div 占满剩下的宽度? 最开始想到的方法就是 div 宽度取 n%, style 设置 margin:auto. 但是这样有一个问题,一定距离是根据 n 的 ...