Точка расширения $.Deferred.getErrorHook

Назначение

Ошибка внутри обработчика .then() может возникнуть после завершения вызывающего кода. Точка расширения $.Deferred.getErrorHook позволяет сохранить объект ошибки до асинхронного перехода, чтобы при диагностике увидеть исходное место вызова.

Настройка и результат

JavaScript
$.Deferred.getErrorHook = function () {
  return new Error("Место запуска цепочки");
};

Свойство появилось в jQuery 3.7, но функция по умолчанию не определена: её устанавливает приложение. Она не принимает аргументов и должна возвращать Error со стеком. При исключении в цепочке сохранённый объект передаётся вторым аргументом в $.Deferred.exceptionHook(error, asyncError).

Ограничения

Это настройка диагностики всей подключённой jQuery, а не обработчик результата операции. Ожидаемые отказы обрабатывайте через .catch() или .fail(). Для рабочего приложения учитывайте стоимость создания стеков. В 4.0 прежний getStackHook удалён; в slim-сборке нет самого Deferred.

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

Диагностика исключения в цепочке: попробуйте сами

Запустите пример: появятся сообщение об ошибке и подтверждение сохранённого стека. Используется полная jQuery 4.0.0.

index.html
HTML
<pre id="result"></pre>
main.js
JavaScript
$.Deferred.getErrorHook = function () {
  return new Error("Запуск цепочки");
};
$.Deferred.exceptionHook = function (error, asyncError) {
  $("#result").text(error.message + "\nСтек сохранён: " + Boolean(asyncError && asyncError.stack));
};
$.Deferred().resolve().then(function () {
  throw new TypeError("Нет данных профиля");
}).catch(function () {
  // Отказ обработан; сообщение уже показала функция диагностики.
});