У меня есть следующее:
cflst.addAll(asList(
supplyAsync(() -> mytask.getComp("comp"), executor)
.thenAccept(comp -> helper.mapStuff(comp))
.exceptionally(ex -> {
sout("Some Error"); // Never print
return null;
})
.handle((comp, throwable) -> {
sout("Error here" + comp); //always prints regarless of exception
return null;
}),
...
));
CompletableFuture.allOf(cflst.toArray(new CompletableFuture[0])).join();
И MyTask.getComp
метод
CompX getComp(String id) {
client.getData(id);
}
Client.getData()
SomeX getData(String id) {
throw new MyCustomRuntimeException("Blew Up");
}
Я подумал, когда исключение выброшенный в метод myComp
, блок exceptionally()
получает исключение. Но это не похоже.
Также, независимо от исключения, handle()
всегда вызывается!?!?!
Я хочу иметь возможность перехватывать любое исключение и обрабатывать его по мере необходимости (Либо повторно выбросить, либо проглотить).
Обновление
Когда я перехватываю исключение в методе getComp
, а затем повторно выбрасываю его, выполняется блок exceptionally
. Но не уверен, почему он не запускается, когда исключение выбрасывается еще на один уровень вниз с помощью метода getData
?