2

私は Java 8 の完了可能な先物を使用しています。未来によってスローされる例外を取得し、それを別の例外に変換できるようにしたいと考えています。

私が試したすべての複合的なものは、例外が発生すると短絡するようです。

たとえば、scala future を使用すると、次のようなことができます。

scala.concurrent.Future<Object> translatedException = ask.recover(new Recover<Object>() {
            @Override public Object recover(final Throwable failure) throws Throwable {
                if (failure instanceof AskTimeoutException) {
                    throw new ApiException(failure);
                }

                throw failure;
            }
        }, actorSystem.dispatcher());

そして、Java の将来の複合ブロックでそれを模倣できるようにしたいと考えています。これは可能ですか?

4

2 に答える 2

3

使用できますCompletableFuture#handle(BiFunction)。例えば

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;
});

ask例外で完了した場合translatedException、潜在的に変換された例外で完了します。それ以外の場合は、同じ成功結果の値になります。

コード内の私のコメントに関して、メソッドは、メソッドが a をスローすると宣言されていないaをhandle期待しています。そのため、ラムダ本体自体は をスローできません。パラメータはタイプであるため、直接指定することはできません。そのタイプであることがわかっている場合はにキャストできます。または、でラップすることもできます。BiFunctionapplyThrowableThrowableeThrowablethrowRuntimeExceptionRuntimeExceptionthrow

于 2015-09-11T02:06:34.943 に答える