Поймать все необработанные отклонения обещаний от javascript
Я хотел бы поймать все необработанные исключения/отклонения, которые происходят в рамках javascript Promise. Есть ли хороший метод для ловли их без добавления .catch(..)
на каждом конце цепочки Promise? (в случае забывания добавить это, ошибка молча исчезает).
Консоль разработчика в Google Chrome может записывать их в журнал, мне также нравится записывать их в рабочей среде.
Для обычных исключений javascript я использую функцию window.onerror
, но ошибки от Promise вызывают эту функцию.
Пример:
window.onerror = function (e) {
alert("unhandled error: " + e);
};
var p = new Promise(function (resolve, reject) {
var nullObject = null;
// Raise a TypeError: Cannot read property 'forceNullError' of null
var x = nullObject.forceNullError();
resolve();
});
p.then(function () { alert('success'); });
JSFiddle: https://jsfiddle.net/f7zwej6L/
*) Я заметил, что WinJS имеет метод .done(..)
для того, что я хочу, но Native Promises не делает.
Ответы
Ответ 1
Весь мир ждет событий unhandledrejection
и rejectionhandled
. По состоянию на март 2016 года Chrome теперь поддерживает его первым.
Пример:
window.addEventListener('unhandledrejection', function(event) {
console.error('Unhandled rejection (promise: ', event.promise, ', reason: ', event.reason, ').');
});
Спецификация: Уровень жизни в HTML
Разработчик Mozilla:
onrejectionhandled, onunhandledrejection
Вопросы хрома: 495801, 393913
Ответ 2
Обратите внимание, что в Node событие называется unhandledRejection
:
process.on('unhandledRejection', function(err, promise) {
console.error('Unhandled rejection (promise: ', promise, ', reason: ', err, ').');
});
В версии 12+ узел прекратит работу при этих отклонениях.
Ответ 3
Некоторые библиотеки имеют свои собственные API для этого. Некоторые браузеры сообщают о необработанных отказах (рано или поздно).
Собственно, done
, вероятно, не делает то, что вы хотите. Вот почему он не является частью спецификации. В любом случае, вы все равно должны помнить, чтобы называть его.
Нет надежного кросс-платформенного, кросс-библиотечного способа сделать это.
Ответ 4
библиотека uncaught может помочь вам поймать необработанные обещания.
И он также обрабатывает непроверенные ошибки.
ИЗМЕНИТЬ
<script type="text/javascript" src=".../uncaught/lib/index.js"></script>
<script type="text/javascript">
uncaught.start();
uncaught.addListener(function (error) {
console.log('Uncaught error or rejection: ', error.message);
});
</script>
Преимущество этого подхода - это единственный интерфейс, который позволяет обрабатывать как необработанные ошибки, так и необработанные обещания.