- 使用
exceptionally
方法
- 使用场景:适用于当异步任务出现异常时,希望返回一个默认值或者进行简单的异常处理并返回替代结果的场景。
- 原理:
exceptionally
方法接收一个Function
作为参数,当CompletableFuture
出现异常时,会调用这个Function
,将异常作为参数传入,在Function
中可以根据异常情况返回一个替代结果。例如:
CompletableFuture.supplyAsync(() -> {
if (Math.random() < 0.5) {
throw new RuntimeException("模拟异常");
}
return "正常结果";
}).exceptionally(ex -> {
System.out.println("捕获到异常: " + ex.getMessage());
return "默认结果";
}).thenAccept(System.out::println);
- 使用
whenComplete
方法
- 使用场景:如果需要在异步任务完成(无论是正常完成还是异常完成)后进行一些通用的处理操作,例如记录日志等,
whenComplete
方法较为合适。
- 原理:
whenComplete
方法接收两个参数,一个是异步任务正常完成时的结果,另一个是任务执行过程中抛出的异常(如果有)。通过这个方法可以在任务结束后统一处理正常和异常情况。例如:
CompletableFuture.supplyAsync(() -> {
if (Math.random() < 0.5) {
throw new RuntimeException("模拟异常");
}
return "正常结果";
}).whenComplete((result, ex) -> {
if (ex != null) {
System.out.println("捕获到异常: " + ex.getMessage());
} else {
System.out.println("正常结果: " + result);
}
});
- 使用
handle
方法
- 使用场景:当需要根据异步任务的执行结果(正常或异常)来返回一个新的结果时,
handle
方法比较适用。它结合了whenComplete
和exceptionally
的部分功能。
- 原理:
handle
方法接收一个BiFunction
,第一个参数是异步任务正常完成时的结果,第二个参数是异常(如果有)。BiFunction
返回一个新的结果,无论任务是正常完成还是异常完成,都会返回这个新结果。例如:
CompletableFuture.supplyAsync(() -> {
if (Math.random() < 0.5) {
throw new RuntimeException("模拟异常");
}
return "正常结果";
}).handle((result, ex) -> {
if (ex != null) {
System.out.println("捕获到异常: " + ex.getMessage());
return "异常处理后的结果";
}
return result + " 处理后";
}).thenAccept(System.out::println);