如何找到以示例方式完成的CompletableFuture

时间:2019-02-13 19:03:31

标签: java java-8 completable-future

我正在使用CompletableFuture,对异常处理有疑问。

我有这样的代码,如果validate()或process()方法中的任何一个抛出异常,则由ExceptionHandler处理。但是,当我像这样使用CompletableFuture时,抛出的异常将包装在CompletionException中。我可以知道如何确保在那里调用ExceptionHandler而不是获取CompletionException吗?

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

2 个答案:

答案 0 :(得分:5)

get()上调用CompletableFuture之前,请先调用此方法isCompletedExceptionally,如果该方法以异常完成则将返回true

public boolean isCompletedExceptionally()
  

如果此CompletableFuture以任何方式异常完成,则返回true。可能的原因包括取消,显式调用completeExceptionally以及突然终止CompletionStage操作。

您还可以为completableFuture添加例外块,因此在执行任务时,如果发生任何异常,它将在输入参数例外情况下例外地执行

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

在上面的示例中,如果执行supplyAsync发生任何异常,则返回失败,否则返回成功

答案 1 :(得分:0)

通过调用以下代码,可以解决我的问题

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

            catch(Throwable impossible) {
                throw impossible;
            }
        }