1.问题引出
CompletableFuture是异步编程的很好工具,那么对于异步编程,最令人担心的现象就是异常被吞掉了。对应的,同步场景,因为天然是同步等结果,无非就是这么几种情况,返回正常结果,抛出异常,等待超时(设置了超时时间),一直等待(没有设置超时时间),但是对于异步场景来说,无论是监听还是会掉,都有可能因为使用方式的错误导致没有会掉或者没有触发监听,造成的结果就是这次的请求的结果凭空丢失了。
举个最简单的例子:

这是一个CompletableFuture最普通的使用方式,异步执行一个任务,如图所示是一个http请求,拿到结果之后执行complete方法,会触发该future的thenRun方法。但是如果这个http请求抛出了异常会怎么样呢?因为没有catch异常并对异常进行相应的处理,所以这个future永远也不会执行,相当于这个http的结果丢了,回调也不会触发了。
那么正确的做法是什么呢?

这样的话在http请求抛出异常的时候,通过completeExceptionally方法触发了future的回调。这就是一个简单的对于异常的处理,防止异常导致无回调的现象发生。但是本篇文章并不是这么简单的就结束了,而是刚刚开始。因为CompletableFuture提供了很强大的功能,封装了很多方法,这些方法如果使用不当,即使你考虑了异常,可能也不会按照你设想的方式去执行,比如:

本文深入探讨了Java CompletableFuture在处理异常时可能出现的问题,包括thenRun和thenCombine方法在异常情况下的行为。通过代码示例和源码分析,揭示了如何避免异常被忽视,确保在异步操作中正确处理并传递异常。文章最后提出了针对双异常场景的解决方案,以确保所有异常都能被捕获和处理。
&spm=1001.2101.3001.5002&articleId=115616750&d=1&t=3&u=58a19cf57d2e47f490a65a7ec05bfa93)
9872

被折叠的 条评论
为什么被折叠?



