我尝试使用CompletableFuture
运行一些任务,并根据whenComplete
中的原因进行不同的处理。
但是取决于我如何“启动”异常(通过将异常从线程中抛出或通过completeExceptionally
传递),异常可以包裹在CompletionException
中。
情况1-包裹了异常:
@Test
void throwsWrappedException () {
final CompletableFuture<Object> objectCompletableFuture = new CompletableFuture<>();
final CompletableFuture<Object> modified = objectCompletableFuture
.whenComplete((message, cause) -> {
throw new AcceptPendingException();
});
modified
.whenComplete((message, cause) -> System.out.println(cause));
objectCompletableFuture.complete(null);
}
情况2-异常不会被包裹:
@Test
void throwsOriginalException() {
final CompletableFuture<Object> objectCompletableFuture = new CompletableFuture<>();
objectCompletableFuture
.whenComplete((message, cause) -> System.out.println(cause));
objectCompletableFuture.completeExceptionally(new AcceptPendingException());
}
是否已记录此行为,并且可以在运行中的线程中发出异常完成信号而无需包装此异常?