Функция $.Deferred.exceptionHook()

Определение и применение

Точка расширения $.Deferred.exceptionHook позволяет сообщать об исключениях внутри преобразований Deferred. Она предназначена для диагностики программных ошибок, которые иначе могут остаться незамеченными в цепочке обещаний.

Синтаксис

JavaScript
$.Deferred.exceptionHook = function (error, asyncError) {
  console.warn(error, asyncError);
};

Параметры и возвращаемое значение

error — выброшенная ошибка. asyncError — дополнительный объект, сохранённый до асинхронного перехода функцией $.Deferred.getErrorHook; без такой настройки он может отсутствовать. Возвращаемое значение диагностической функции не используется.

Настройка действует на подключённый экземпляр jQuery. Сохраните прежнюю функцию, если заменяете её временно. По умолчанию jQuery предупреждает о типичных программных ошибках, например TypeError и ReferenceError, а не о каждом ожидаемом отказе приложения.

Особенности и совместимость

Доступна с 3.0; для примера нужна полная сборка с Deferred. Диагностическая функция не восстанавливает цепочку и не заменяет .catch() или .fail(). Простой deferred.reject() сам по себе не является выброшенным исключением.

Исключения в обычных обработчиках .done() не следует считать автоматически перехваченными этим механизмом. Пример намеренно использует .then(): ошибка преобразования становится отказом дочерней цепочки.

Документация

Пример использования

Диагностика и обработка отказа: попробуйте сами

Появятся диагностическое сообщение и подтверждение обработки отказа через .catch(). Используется jQuery 4.0.0.

index.html
HTML
<pre id="result"></pre>
main.js
JavaScript
$.Deferred.exceptionHook = function (error) {
    $('#result').append('Диагностика: ' + error.message + '\n')
}
$.Deferred()
    .resolve()
    .then(function () {
        throw new TypeError('Нет цены')
    })
    .catch(function () {
        $('#result').append('Отказ обработан')
    })