akka/akka-http

Exception in failed CompletionStage is always wrapped in CompletionException

Open

#1,267 opened on Jul 5, 2017

View on GitHub
 (4 comments) (1 reaction) (0 assignees)Scala (598 forks)batch import
1 - triagedhelp wantedt:javat:routingt:server

Repository metrics

Stars
 (1,311 stars)
PR merge metrics
 (Avg merge 1d 10h) (2 merged PRs in 30d)

Description

When using the completeOKWithFutureString or completeOKWithFuture directives from the javadsl, the exception in a failed CompletionStage is always wrapped in a CompletionException.

This is unfortunate, as you end up writing ExceptionHandlers like this:

    ExceptionHandler exceptionHandler = ExceptionHandler.newBuilder()
            .match(CompletionException.class, e -> {
              if (e.getCause() instanceof IllegalStateException) return complete(StatusCodes.NOT_FOUND);
              // Etc.
              else return complete(StatusCodes.INTERNAL_SERVER_ERROR);
            })
            .build();

The CompletionException doesn't appear to contain any useful information (not in the stacktrace either), perhaps we should consider unwrapping it in akka-http - though that would be a breaking change. Perhaps we could deprecate completeOKWithFuture(String) and add completeOKWithCompletionStage(String) that unwraps, as that's the native terminology anyway?

Contributor guide