知识卡片
异步链必须处理异常
内容
CompletableFuture 链默认只关注成功路径;某阶段抛异常,链条会异常完成,若无显式处理容易被静默吞掉。JDK 提供 whenComplete/exceptionally 钩子,或用 handle(BiFunction<T,Throwable,U>) 统一处理:同一回调能拿到结果和异常,非 null 说明出过错,handle 都会被调用并可返回兜底结果。异步链闭环需规划失败处理。
参考来源
- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第10章《CompletableFuture异步回调》10.1.5节《调用handle()方法统一处理异常和结果》(源文件:_epub-src/OEBPS/Text/chapter304.xhtml)
- 结论依据:原文说明“除了分别通过whenComplete、exceptionally设置完成钩子、异常钩子之外,还可以调用handle()方法统一处理结果和异常”,并给出示例:异步任务内部抛出RuntimeException后,`future.handle(...)`的BiFunction依然被调用,通过判断`throwable == null`区分是否发生异常并输出对应提示,运行结果证明抛出异常后handle回调正常执行而不是让整个链条崩溃退出,因此推出本卡结论。
- 原始内容:除了分别通过whenComplete、exceptionally设置完成钩子、异常钩子之外,还可以调用handle()方法统一处理结果和异常……if (throwable == null) { Print.tcfo("没有发生异常!"); } else { Print.tcfo("sorry,发生了异常!"); }……[ForkJoinPool.commonPool-worker-1]:抛出异常![ForkJoinPool.commonPool-worker-1|CompletableFutureDemo$3.apply]:sorry,发生了异常!