РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1076 of 1163 menu

Метод exceptionally

Метод exceptionally класса CompletableFuture позволяет обработать исключение, которое возникло на любом этапе асинхронной цепочки. В параметр мы передаем функцию типа Function, которая принимает объект Throwable и возвращает значение того же типа, что и исходный CompletableFuture. Если исходное вычисление завершилось успешно, переданная функция не вызывается, и результат остается неизменным. Если же произошло исключение, функция будет вызвана, а ее возвращаемое значение станет результатом нового CompletableFuture.

Синтаксис

CompletableFuture<T> exceptionally(Function<Throwable, ? extends T> fn)

Пример

Давайте создадим асинхронную задачу, которая выбрасывает исключение, и обработаем его с помощью exceptionally:

import java.util.concurrent.CompletableFuture; public class Main { public static void main(String[] args) { CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { throw new RuntimeException("Something went wrong"); }); CompletableFuture<String> res = future.exceptionally(ex -> { return "Recovered: " + ex.getMessage(); }); System.out.println(res.join()); } }

Результат выполнения кода:

"Recovered: Something went wrong"

Пример

Если исключения не произошло, функция обработки игнорируется, и возвращается исходный результат:

import java.util.concurrent.CompletableFuture; public class Main { public static void main(String[] args) { CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { return "abcde"; }); CompletableFuture<String> res = future.exceptionally(ex -> { return "Fallback"; }); System.out.println(res.join()); } }

Результат выполнения кода:

"abcde"

Пример

Метод exceptionally можно комбинировать с другими методами цепочки, например, с thenApply. Обработка исключения произойдет после всех предыдущих этапов:

import java.util.concurrent.CompletableFuture; public class Main { public static void main(String[] args) { CompletableFuture<Integer> future = CompletableFuture .supplyAsync(() -> { return Integer.parseInt("12345"); }) .thenApply(num -> num / 0) .exceptionally(ex -> { System.out.println("Caught: " + ex.getMessage()); return -1; }); System.out.println(future.join()); } }

Результат выполнения кода:

"Caught: / by zero" -1

Смотрите также

  • класс CompletableFuture,
    который представляет асинхронное вычисление
  • метод handle,
    который обрабатывает и результат, и исключение
  • метод whenComplete,
    который выполняет действие при завершении
  • метод completeExceptionally,
    который завершает future с исключением
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить