我正在使用CompletableFuture,对异常处理有疑问。
我有这样的代码,如果validate()或process()方法中的任何一个抛出异常,则由ExceptionHandler处理。但是,当我像这样使用CompletableFuture时,抛出的异常将包装在CompletionException中。我可以知道如何确保在那里调用ExceptionHandler而不是获取CompletionException吗?
CompletableFuture<Response> response = CompletableFuture
.supplyAsync(() -> {
validationService.validate(request);
return myService.process(request, headers);
});
答案 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;
}
}