Чем различаются exceptionally, handle и whenComplete у CompletableFuture?
exceptionally — только при ошибке, подменяет результат. handle — вызывается всегда, получает значение и исключение и возвращает новый результат. whenComplete — побочный эффект (лог, метрика) без изменения результата: ошибка идёт дальше.
- Исключение приходит обёрнутым в CompletionException — смотреть getCause
- Java 12+: exceptionallyCompose для асинхронного восстановления
- Исключение внутри whenComplete не заменит исходное
А ещё Не обработанная нигде ошибка теряется молча
Подробно
Выбор зависит от намерения. Нужно подставить значение по умолчанию при сбое — exceptionally. Нужно единообразно превратить оба исхода в какой-то результат — handle. Нужно записать метрику или лог, ничего не меняя, — whenComplete: он пробрасывает исходный результат или исключение дальше, даже если внутри что-то пошло не так. Важная деталь, о которой часто забывают: исключение внутри цепочки заворачивается в CompletionException, поэтому при разборе причины нужно смотреть getCause. И ещё одна: стадии, добавленные после места сбоя и не обрабатывающие ошибку, просто пропускаются — результат пробрасывается дальше в состоянии исключения.
Что хотят услышать
- Назначение трёх методов.
- Обёртка CompletionException.
Частые ошибки
- Ожидать от whenComplete подмены результата.
- Не разворачивать CompletionException при анализе причины.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓exceptionally — только при ошибке, handle — всегда и меняет результат, whenComplete лишь наблюдает
- ✗whenComplete подменяет результат, handle только наблюдает, а exceptionally срабатывает при любом исходе
- ✗Это три синонима с разными сигнатурами
- ✗exceptionally перехватывает ошибки всех последующих стадий, а не предыдущих
Что спросят дальше
- Что произойдёт с thenApply после стадии, завершившейся исключением?
- Почему исключение оборачивается в CompletionException?
Разбор темы
- Future и CompletableFuture
Ограничения Future, асинхронная композиция CompletableFuture, async-варианты с пулами и обработка ошибок.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.