Почему onerror не перехватывает исключения из promises и асинхронных функций

#javascript #promise #onerror

#javascript #обещание #onerror

Вопрос:

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

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

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

 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();  

Комментарии:

1. для этого у Promise есть второй параметр, который является обработчиком функции отклонения, который может быть обработан с помощью .catch() для Promise . Это уже подразумевает, что обещание использует try / catch

Ответ №1:

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

 window.onerror = function(message, source, lineno, colno, error) {
  console.log('onerror handler logging error', message);
  return true;
}
window.onunhandledrejection = function(errorEvent) {
  console.log('onunhandledrejection handler logging error', errorEvent);
  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. кстати, я не думаю, что onunhandledrejection имеет тот же интерфейс, что и onerror

Ответ №2:

Вы можете добавить, addEventListener чтобы исправить это, поскольку throw new Exception() это приведет к возникновению события ошибки. So 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);
})
  

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