CompletableFuture在异步处理时,可能会发生异常,这时候就需要正确去处理异常。
本文主要讲whenComplete
、exceptionally
、handle
方法去处理异常,关键代码展示用法。
我主要使用exceptionally方法。
使用whenComplete
方法
whenComplete
方法可以在任务完成时触发回调函数,无论是正常完成还是发生异常。通过在whenComplete
方法中处理异常,我们可以确保异常得到正确的传播和处理。
1 | CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> { |
在上面的代码中,我们使用whenComplete
方法来处理异常。在回调函数中,我们检查ex
参数是否为null,如果不为null,则说明发生了异常,并进行相应的处理。这样,异常就能够正确地传播并在需要时进行处理。
使用exceptionally
方法
exceptionally
方法可以用于处理异常,并返回一个默认值或执行其他操作。在使用exceptionally
方法时,我们需要确保正确地处理异常并重新抛出,以便异常能够传播到后续阶段。
1 | CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> { |
在上面的代码中,我们使用exceptionally
方法处理异常。在异常处理函数中,我们打印错误信息并重新抛出异常。这样,异常就能够正确地传播到后续阶段。
使用handle
方法
handle
方法可以用于处理异常,并根据需要返回一个新的结果。与exceptionally
方法不同的是,handle
方法可以处理正常的返回结果和异常,并返回一个新的结果。
1 | CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> { |
在上面的代码中,我们使用handle
方法处理异常。在处理函数中,我们检查异常是否为null,如果不为null,则说明发生了异常并返回一个默认值。否则,我们返回正常的结果。
总结
如果需要处理异常,建议以下三种方式实现:
- supplyAsync + exceptionally:supplyAsync中处理正常返回,exceptionally中处理异常返回。
- supplyAsync + handle:supplyAsync中处理正常返回,handle中处理异常返回,同时handle还可以继续处理正常返回。
- supplyAsync + whenComplete + exceptionally:supplyAsync中处理正常返回,whenComplete可以继续处理正常或异常返回,exceptionally中处理异常返回。