2014-12-11 2 views
18

Java 8 CompletableFuture.exceptionally 메서드의 이상한 동작이 발생했습니다. 이 코드를 실행하면, 그것을 잘 작동 및 인쇄 java.lang.RuntimeExceptionJava 8 CompletableFuture의 놀라운 동작 예외적 인 메서드

CompletableFuture<String> future = new CompletableFuture<>(); 

future.completeExceptionally(new RuntimeException()); 

future.exceptionally(e -> { 
      System.out.println(e.getClass()); 
      return null; 
}); 

하지만 원래 제외 java.util.concurrent.CompletionExceptionthenApply처럼, 향후 처리에서 예외 유형 변경을 또 다른 단계를 추가 할 경우 내부 감쌌다.

CompletableFuture<String> future = new CompletableFuture<>(); 

future.completeExceptionally(new RuntimeException()); 

future.thenApply(v-> v).exceptionally(e -> { 
      System.out.println(e); 
      return null; 
}); 

왜 이런 일이 발생해야합니까? 제 생각에는 꽤 놀라운 일입니다.

답변

20

이 문제 is specified in the class documentation of CompletionStage (fourth bullet) :

방법 handle 추가적으로 다른 단계에 의존하여 추가적인 프로세싱을 활성화 할 수있는 여분의 결과를 계산하는 단계를 허용한다. 다른 모든 경우에 스테이지의 계산이 (확인되지 ​​않은) 예외 또는 오류와 함께 갑자기 종료되면 완료를 요구하는 모든 종속 스테이지도 예외적으로 원인으로 예외가 포함 된 CompletionException과 함께 예외적으로 완료됩니다. 당신은 당신이 , 당신은에 exceptionally를 호출 한 단계 여부를 알고 싶어 수 있음을 고려한다면

그것은 그 놀라운 일이 아니다, 실패 또는 그 중 하나가 직접 또는 간접적 전제 조건입니다. 이전 단계 중 하나에서 발생 된 원래 예외를 원하는 경우

1
예, 동작이 예상되는

하지만, 당신은 단순히 this-

CompletableFuture<String> future = new CompletableFuture<>(); 

future.completeExceptionally(new RuntimeException()); 

future.thenApply(v-> v).exceptionally(e -> { 
     System.out.println(e.getCause()); // returns a throwable back 
     return null; 
}); 
을 사용할 수 있습니다
관련 문제