akka/akka-http

Exception in failed CompletionStage is always wrapped in CompletionException

Aperta

#1267 aperta il 5 lug 2017

 (4 commenti) (1 reazione) (0 assegnatari)Scala (598 fork)batch import
1 - triagedhelp wantedt:javat:routingt:server

Metriche repository

Star
 (1311 stelle)
Metriche merge PR
 (Merge medio 1g 10h) (2 PR mergiate in 30 g)

Descrizione

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?

Guida contributor