Почему onerror не перехватывает исключения из обещаний и асинхронных функций - PullRequest
2 голосов
/ 15 марта 2019

Я хочу использовать onerror для перехвата и регистрации всех ошибок, которые происходят в моем приложении JavaScript. Это работает, как и ожидалось, за исключением случаев использования обещаний или асинхронных функций.

В следующем фрагменте исключение, выданное fail, перехватывается, как и ожидалось, но rejectPromise и throwAsync вместо вызова обработчика onerror всегда показывают Uncaught (in promise) Error в консоли?

Как я могу всегда перехватывать все ошибки в базе кода, которая использует обещания и асинхронные функции?

window.onerror = function(message, source, lineno, colno, error) {
  console.log('onerror handler logging error', message);
  return true;
}

function rejectPromise() {
  return Promise.reject(new Error('rejected promise'));
}

async function throwAsync() {
  throw new Error('async exception');
}

function fail() {
  throw new Error('exception');
}

rejectPromise().then(() => console.log('success'));
throwAsync();
fail();

Ответы [ 2 ]

4 голосов
/ 15 марта 2019

Вы можете добавить обработчик окна для onunhandledrejection, поскольку необработанные отклонения Promise - это не то же самое, что ошибки. Проверьте результаты приведенного ниже фрагмента в консоли браузера (не в консоли фрагмента, при попытке отображения большого объекта возникнут проблемы):

window.onerror = function(message, source, lineno, colno, error) {
  console.log('onerror handler logging error', message);
  return true;
}
window.onunhandledrejection = function(message, source, lineno, colno, error) {
  console.log('onunhandledrejection handler logging error', message);
  return true;
}


function rejectPromise() {
  return Promise.reject(new Error('rejected promise'));
}

async function throwAsync() {
  throw new Error('async exception');
}

function fail() {
  throw new Error('exception');
}

rejectPromise().then(() => console.log('success'));
throwAsync();
fail();
1 голос
/ 15 марта 2019

Вы можете добавить addEventListener, чтобы исправить это, так как throw new Exception() будет вызывать событие ошибки.Так что fail() вызовет событие error

window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

window.addEventListener('unhandledrejection', function (e) {
  alert("Error occurred: " + e.reason.message);
})

Надеюсь, это поможет !!

...