Получить доступ

Чем различаются exceptionally, handle и whenComplete у CompletableFuture?

MiddleМногопоточность
Коротко

exceptionally — только при ошибке, подменяет результат. handle — вызывается всегда, получает значение и исключение и возвращает новый результат. whenComplete — побочный эффект (лог, метрика) без изменения результата: ошибка идёт дальше.

  • Исключение приходит обёрнутым в CompletionException — смотреть getCause
  • Java 12+: exceptionallyCompose для асинхронного восстановления
  • Исключение внутри whenComplete не заменит исходное

А ещё Не обработанная нигде ошибка теряется молча

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Выбор зависит от намерения. Нужно подставить значение по умолчанию при сбое — exceptionally. Нужно единообразно превратить оба исхода в какой-то результат — handle. Нужно записать метрику или лог, ничего не меняя, — whenComplete: он пробрасывает исходный результат или исключение дальше, даже если внутри что-то пошло не так. Важная деталь, о которой часто забывают: исключение внутри цепочки заворачивается в CompletionException, поэтому при разборе причины нужно смотреть getCause. И ещё одна: стадии, добавленные после места сбоя и не обрабатывающие ошибку, просто пропускаются — результат пробрасывается дальше в состоянии исключения.

Что хотят услышать

  • Назначение трёх методов.
  • Обёртка CompletionException.

Частые ошибки

  • Ожидать от whenComplete подмены результата.
  • Не разворачивать CompletionException при анализе причины.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓exceptionally срабатывает только при ошибке и подменяет результат; handle получает и результат, и исключение и возвращает новое значение; whenComplete лишь наблюдает и не меняет исход
  • ✗Это три синонима с разными сигнатурами
  • ✗whenComplete подменяет результат, а handle только наблюдает
  • ✗exceptionally перехватывает ошибки всех последующих стадий, а не предыдущих

Что спросят дальше

  • Что произойдёт с thenApply после стадии, завершившейся исключением?
  • Почему исключение оборачивается в CompletionException?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем