Map exception in completable future to a different exception type?

后端 未结 1 1729
小鲜肉
小鲜肉 2021-01-15 14:36

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

相关标签:
1条回答
  • 2021-01-15 15:15

    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.

    0 讨论(0)
提交回复
热议问题