未处理的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 并告知用户(可能还有我们的服务器)有关信息,以使我们的应用程序永远不会“死掉”。
摘录于原文链接