学习链接
Tracking unhandled rejected Promises
如何给所有的async函数添加try/catch?(评论区讨论和提供思路)
捕获未处理的 Promise 错误
function throwError() {
new Promise((resolve, reject) => {
resolve();
}).then(() => {
throw new Error('a error from promise');
});
}
throwError();
// Uncaught (in promise) Error: a error from promise
目的:在不改动函数内部代码的情况下,捕获抛出的错误。
浏览器中
unhandledrejection
当 Promise
被 reject
且没有 reject
处理器的时候,会触发 unhandledrejection
事件。
故监听 unhandledrejection
事件,即可捕获到未处理的 Promise 错误。
window.addEventListener('unhandledrejection', function (event) {});
这个事件对象是个 PromiseRejectionEvent 实例,较为重要的三个参数是
type
一个代表 PromiseRejectionEvent 的类型名称的字符串。这是区分大小写的同时必须是"rejectionhandled"
或者"unhandledrejection"
其中之一。promise
代表被rejected
的Promise
。reason
代表promise
被rejected
的原因的值或者对象Object
。
window.addEventListener('unhandledrejection', function (event) {
console.log(event.promise);
console.log(event.reason);
event.promise.catch(console.log);
// event.preventDefault(); // 阻止默认行为,比如不在控制台出现错误
});
rejectionhandled
当 Promise
被 rejected
最初未被处理,但稍后又得到了 rejection
处理器时,会触发 rejectionhandled
事件。
window.addEventListener('rejectionhandled', function (event) {});
这个事件对象同样是个 PromiseRejectionEvent 实例。
window.addEventListener('rejectionhandled', function (event) {
console.log(event.promise);
console.log(event.reason);
event.promise.catch(console.log);
// event.preventDefault();
});
例子:
window.addEventListener('unhandledrejection', function (event) {
console.log('unhandledrejection: ', event.promise);
console.log('unhandledrejection: ', event.reason);
// event.promise.catch(console.log);
// event.preventDefault();
});
window.addEventListener('rejectionhandled', function (event) {
console.log('rejectionhandled: ', event.promise);
console.log('rejectionhandled: ', event.reason);
event.promise.catch(e => {
console.log('rejectionhandled: ', e)
});
// event.preventDefault();
});
function throwError() {
const instance = new Promise((resolve, reject) => {
resolve();
}).then(() => {
throw new Error('a error from promise');
})
setTimeout(() => {
instance.catch(e => {
console.log('setTimeout: ', e);
});
}, 2000);
}
throwError();
Node.js 中
process.on('unhandledRejection', (reason, promise) => {
console.log(promise);
console.log(reason);
});