2016-08-28 3 views
2

私は例外的に.handleを試みていましたが、それらは機能していないようです。スカラーでは、finallyブロック(これは例外と成功で実行されます)のようなクロージャーを使用して、将来のメソッドを呼び出すことができます。また、チェーン上の例外または成功をそのまま伝えることができます。結果やエラーを伝播中にCompletableFutureコールバックを呼び出す方法は?

私は

CompletableFuture<Object> future = newFuture.handle((r, e) -> { 
     if(r != null) 
      return r; 
     else if(e != null) 
      return e; 
     else 
      return new RuntimeException("Asdf");    
    }); 

    Assert.assertTrue(future.isCompletedExceptionally()); 

...これを試してみましたが、そのテストは、例外(どのような奇妙な)の結果と完全に成功し、将来として失敗しました。

+0

例外を 'handle()'に正しく伝播するには、例外を 'スローする '必要があります。そうでなければ、結果を変換せずに副作用をしたいだけなら 'whenComplete'を使用するべきですという答えは最善の方法です。 – acelent

答えて

3

使用CompletableFuture#whenComplete(BiConsumer)動作しているようです....私はそれを得たと思います。そのjavadocの状態

は、この段階が完了したときに特定のアクションを実行し、同じ結果または この段階として例外、との新しいCompletionStageを返します。引数としてこの 段階の

この段階が完了すると(いずれも場合はnull)、所与のアクションが 結果で呼び出され、例外(またはnullなし場合)。返されたステージは、アクション が返ったときに完了します。指定されたアクション自体に例外が発生した場合、 このステージも例外的に完了しない限り、返されたステージはこの例外で例外的に完了します。

つまり、成功または失敗に関係なく呼び出され、BiConsumerが例外をスローしない限り、最初の未来の状態を伝播します。あなたは結果を変換するために必要な場合

CompletableFuture<String> future2 = newFuture.whenComplete((r, e) -> { 
    // consume the result 
}); 

(あなたの例では、あなたはしていない)、あなたはhandleを使用して、物事を自分で伝播することができます。

0

はohhhhh、私はこのようなものは

CompletableFuture<Integer> future2 = newFuture.handle((r, e) -> { 

     //put finally like logic right here.... 

     if(r != null) 
      return r; 
     else if(e != null) 
      throw new RuntimeException(e); 
     else 
      throw new RuntimeException("weird"); 
    }); 
関連する問題