Как найти CompletableFuture завершенным исключительно - PullRequest
0 голосов
/ 13 февраля 2019

Я использую CompletableFuture и у меня есть вопрос об обработке исключений.

У меня есть такой код, если какой-либо из методов validate () или process () выдает исключение, то оно обрабатывается ExceptionHandler.Однако когда я использую CompletableFuture, как это, тогда выброшенное исключение оборачивается в CompletionException.Могу ли я узнать, как я могу убедиться, что мой ExceptionHandler вызывается там вместо получения CompletionException?

CompletableFuture<Response> response = CompletableFuture
                .supplyAsync(() -> {
                    validationService.validate(request);
                    return myService.process(request, headers);
                });

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Перед вызовом get() на CompletableFuture вызовите этот метод isCompletedExceptionally, вернет true, если завершится с исключением

public boolean isCompletedExceptionally()

Возвращает true, если это CompletableFuture выполнено исключительно, каким-либо образом,Возможные причины включают отмену, явный вызов completeExceptionally и внезапное завершение действия CompletionStage.

Вы также можете добавить исключительный блок для completetableFuture, поэтому при выполнении задачи, если возникнет какое-либо исключение, он выполнит исключительноза исключением входного аргумента

CompletableFuture<String> future = CompletableFuture.supplyAsync(()-> "Success")
                                   .exceptionally(ex->"failed");

В приведенном выше примере, если произойдет какое-либо исключение, выполнение supplyAsync не удастся вернется или в противном случае Success будет возвращено

0 голосов
/ 13 февраля 2019

Понял, позвонив по следующему коду, это решит мою проблему

try {
            response.join();
        }
        catch(CompletionException ex) {
            try {
                throw ex.getCause();
            }

            catch(Throwable impossible) {
                throw impossible;
            }
        }
...