akka/akka-http

Exception in failed CompletionStage is always wrapped in CompletionException

Open

#1267 opened on Jul 5, 2017

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

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