I\'m using java 8\'s completable futures and I\'d like to be able take an exception that is throwing by the future and transform it to a different exception.
All th
You can use CompletableFuture#handle(BiFunction). For example
CompletableFuture<String> ask = CompletableFuture.supplyAsync(() -> {
throw new IndexOutOfBoundsException();
});
CompletableFuture<String> translatedException = ask.handle((r, e) -> {
if (e != null) {
if (e instanceof IndexOutOfBoundsException) {
throw new IllegalArgumentException();
}
throw (RuntimeException) e; // this is sketchy, handle it differently, maybe by wrapping it in a RuntimeException
}
return r;
});
If ask
completed with an exception, then translatedException
will complete with a potentially transformed exception. Otherwise, it will have the same success result value.
Concerning my comment in the code, the handle
method expects a BiFunction
whose apply
method is not declared to throw a Throwable
. As such, the lambda body cannot itself throw a Throwable
. The parameter e
is of type Throwable
so you can't throw
it directly. You can cast it to RuntimeException
if you know it's of that type, or you can wrap it in a RuntimeException
and throw
that.