Вопрос: как я могу напрямую выбросить настраиваемое исключение из .exceptionally()
?
List<CompletableFuture<Object>> futures =
tasks.stream()
.map(task -> CompletableFuture.supplyAsync(() -> businessLogic(task))
.exceptionally(ex -> {
if (ex instanceof BusinessException) return null;
//TODO how to throw a custom exception here??
throw new BadRequestException("at least one async task had an exception");
}))
.collect(Collectors.toList());
try {
List<Object> results = futures.stream()
.map(CompletableFuture::join)
.collect(Collectors.toList());
} catch (CompletionException e) {
if (e.getCause() instanceof RuntimeException) {
throw (RuntimeException) e.getCause();
}
throw new RuntimeException(e.getCause());
}
Проблема: я всегда получаю CompletionException
, ex.getCause()
которого является instanceof BadRequestException
.
Это вообще возможно?
CompletionException
- person Eugene   schedule 28.02.2018CompletableFuture
в конечном итоге вызоветencodeThrowable(Throwable x)
, гдеx
ваше исключение, и вернетnew AltResult((x instanceof CompletionException) ? x : new CompletionException(x));
- следовательно, вы всегда получитеCompletionException
. Единственное, что я вижу, чтобы напрямую получить ваше исключение, - это расширить егоCompletionException
. - person Thomas   schedule 28.02.2018try {..} catch (CompletionException e)
и повторно выбросить базовое исключение за пределы? Пожалуйста, посмотрите мое обновление: это делает его очень шаблонным, но, вероятно, лучшего решения нет? - person membersound   schedule 28.02.2018ex.addSuppressed(new BadRequestException("at least one async task had an exception"))
, а затем перейти кArrays.stream(e.getSuppressed()).filter(...)
- person HRgiger   schedule 28.02.2018RuntimeException
, чтобы обернуть причину, когдаCompletionException
уже является исключением времени выполнения, обертывающим причину? Просто используйтеcatch(CompletionException e) { throw e.getCause() instanceof RuntimeException? (RuntimeException)e.getCause(): e; }
- person Holger   schedule 01.03.2018RuntimeException
самим собой ... - person membersound   schedule 01.03.2018RuntimeException
обертывания любого метательного объекта не является улучшением по сравнению сExecutionException
обертыванием того же метательного объекта. - person Holger   schedule 01.03.2018BusinessException
, заменив наnull
, и обработать любое другое исключение, выбрасываяBadRequestException
? Это также должно быть отражено в предложенииcatch
. Но просто скажи ... действительно ли ты этого хочешь? Это противоречит всем вашим предыдущим комментариям. - person Holger   schedule 01.03.2018