Метод 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 с исключением