未处理的rejection

未处理的rejection

当一个error没有被处理会发生什么?例如,忘了在链的尾端附加.catch,

new Promise(function() {
  noSuchFunction(); // 这里出现 error(没有这个函数)
})
  .then(() => {
    // 一个或多个成功的 promise 处理程序(handler)
  }); // 尾端没有 .catch!

如果出现error,promise的状态将变为“rejected”,然后执行应该跳转至最近的rejection处理程序(handler)。但是上面这个例子中并没有这样的处理程序(handler),因此error会“卡住(stuck)”。没有代码来处理它。在实际开发中,就像代码中常规的未处理的error一样,这意味着某些东西出了问题。

当发生一个常规的错误(error)并且未被try…catch捕获时会发生什么?脚本死了,并在控制台(console)中留下了一个信息。对于在promise中未被处理的rejecttion,也会发生类似的事。

JavaScript引擎会根据此类rejection,在此种情况下会生成一个全局的error。

在浏览器中,我们可以使用unhandledrejection事件来捕获这类error:

window.addEventListener('unhandledrejection', function(event) {
  // 这个事件对象有两个特殊的属性:
  alert(event.promise); // [object Promise] - 生成该全局 error 的 promise
  alert(event.reason); // Error: Whoops! - 未处理的 error 对象
});

new Promise(function() {
  throw new Error("Whoops!");
}); // 没有用来处理 error 的 catch

如果出现了一个 error,并且在这儿没有 .catch,那么 unhandledrejection 处理程序(handler)就会被触发,并获取具有 error 相关信息的 event 对象,所以我们就能做一些后续处理了。

通常此类 error 是无法恢复的,所以我们最好的解决方案是将问题告知用户,并且可以将事件报告给服务器。

在任何情况下我们都应该有 unhandledrejection 事件处理程序(用于浏览器,以及其他环境的模拟),以跟踪未处理的 error 并告知用户(可能还有我们的服务器)有关信息,以使我们的应用程序永远不会“死掉”。

摘录于原文链接

posted @ 2020-11-11 19:48  actorhuang  阅读(274)  评论(0编辑  收藏  举报