Concurrency
CompletableFuture: join は失敗をCompletionExceptionで包む
非同期処理が失敗すると、joinは元の例外をそのままではなくCompletionExceptionのcauseとして送出します。
SourceCompletableFutureFailures.java
Java 21
package examples.concurrency;
import java.util.concurrent.CompletableFuture;
public final class CompletableFutureFailures {
private CompletableFutureFailures() {}
public static String joinFailedFuture() {
return CompletableFuture.<String>failedFuture(new IllegalArgumentException("invalid input"))
.join();
}
}TestCompletableFutureFailuresTest.java
Java 21
package examples.concurrency;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertThrows;
import java.util.concurrent.CompletionException;
import org.junit.jupiter.api.Test;
class CompletableFutureFailuresTest {
@Test
void joinは非同期処理の失敗をCompletionExceptionで包む() {
CompletionException exception =
assertThrows(CompletionException.class, CompletableFutureFailures::joinFailedFuture);
assertInstanceOf(IllegalArgumentException.class, exception.getCause());
assertEquals("invalid input", exception.getCause().getMessage());
}
}01Assertion
このテストで確認できること
- failedFutureのjoinはCompletionExceptionを送出する
- getCauseで元のIllegalArgumentExceptionを取り出せる
joinを呼ぶ境界ではCompletionExceptionを考慮し、原因例外を確認してアプリケーションの例外方針へ変換します。
OBSERVED RESULT
expected exception: join → CompletionException
actual: CompletionException
expected cause: IllegalArgumentException
actual: IllegalArgumentException