Подтвердить что ты не робот

Поймать все необработанные отклонения обещаний от 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 не делает.

4b9b3361

Ответ 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>

Преимущество этого подхода - это единственный интерфейс, который позволяет обрабатывать как необработанные ошибки, так и необработанные обещания.