#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);
})
Надеюсь, это поможет!!