学习链接

捕获未处理的Promise错误

Tracking unhandled rejected Promises

如何给所有的async函数添加try/catch?(评论区讨论和提供思路)

捕获未处理的 Promise 错误

  1. function throwError() {
  2. new Promise((resolve, reject) => {
  3. resolve();
  4. }).then(() => {
  5. throw new Error('a error from promise');
  6. });
  7. }
  8. throwError();
  9. // Uncaught (in promise) Error: a error from promise

目的:在不改动函数内部代码的情况下,捕获抛出的错误

浏览器中

unhandledrejection

MDN: unhandledrejection

Promisereject 且没有 reject 处理器的时候,会触发 unhandledrejection 事件。

故监听 unhandledrejection 事件,即可捕获到未处理的 Promise 错误。

  1. window.addEventListener('unhandledrejection', function (event) {});

这个事件对象是个 PromiseRejectionEvent 实例,较为重要的三个参数是

  • type
    一个代表 PromiseRejectionEvent 的类型名称的字符串。这是区分大小写的同时必须是 "rejectionhandled" 或者 "unhandledrejection" 其中之一。

  • promise
    代表被 rejectedPromise

  • reason
    代表 promiserejected 的原因的值或者对象 Object

  1. window.addEventListener('unhandledrejection', function (event) {
  2. console.log(event.promise);
  3. console.log(event.reason);
  4. event.promise.catch(console.log);
  5. // event.preventDefault(); // 阻止默认行为,比如不在控制台出现错误
  6. });

rejectionhandled

MDN: rejectionhandled

Promiserejected 最初未被处理,但稍后又得到了 rejection 处理器时,会触发 rejectionhandled 事件。

  1. window.addEventListener('rejectionhandled', function (event) {});

这个事件对象同样是个 PromiseRejectionEvent 实例。

  1. window.addEventListener('rejectionhandled', function (event) {
  2. console.log(event.promise);
  3. console.log(event.reason);
  4. event.promise.catch(console.log);
  5. // event.preventDefault();
  6. });

例子:

  1. window.addEventListener('unhandledrejection', function (event) {
  2. console.log('unhandledrejection: ', event.promise);
  3. console.log('unhandledrejection: ', event.reason);
  4. // event.promise.catch(console.log);
  5. // event.preventDefault();
  6. });
  7. window.addEventListener('rejectionhandled', function (event) {
  8. console.log('rejectionhandled: ', event.promise);
  9. console.log('rejectionhandled: ', event.reason);
  10. event.promise.catch(e => {
  11. console.log('rejectionhandled: ', e)
  12. });
  13. // event.preventDefault();
  14. });
  15. function throwError() {
  16. const instance = new Promise((resolve, reject) => {
  17. resolve();
  18. }).then(() => {
  19. throw new Error('a error from promise');
  20. })
  21. setTimeout(() => {
  22. instance.catch(e => {
  23. console.log('setTimeout: ', e);
  24. });
  25. }, 2000);
  26. }
  27. throwError();

Node.js 中

  1. process.on('unhandledRejection', (reason, promise) => {
  2. console.log(promise);
  3. console.log(reason);
  4. });