学习链接
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);});
