exceptionally仅捕获上游异常且必须返回同类型结果;handle则统一处理成功与异常两种情况,参数为BiFunction,支持结果清洗与日志聚合。

CompletableFuture的异常处理_exceptionally与handle方法的使用

exceptionally 只捕获上游异常,且必须返回同类型结果

当你只关心“出错了怎么兜底”,不打算处理正常流程,exceptionally 是最轻量的选择。但它有个硬约束:参数只能是 Throwable,返回值类型必须和原始 CompletableFuture 的泛型一致——哪怕你只是想返回个默认值,也得手动 cast 或构造。

handle 是真正的“结果/异常二合一”处理器

handle 的签名是 BiFunction,两个参数始终存在:成功时 Throwablenull,失败时 Tnull。这意味着你能写统一逻辑判断分支,也更容易做类型转换或日志聚合。

别在 exceptionally 里 throw 新异常,除非你真想中断链式调用

exceptionally 的设计本意是“兜底并继续”,如果你在里面 throw 新异常,下游的 thenApply 会跳过,但再后面的 exceptionallyhandle 仍能捕获——这容易造成异常处理逻辑分散,调试时找不到源头。

handle 和 exceptionally 对下游链的影响完全一致

很多人以为 handle 会“吞掉”异常、让后续 thenApply 正常执行,其实不然:只要 handle 返回的是非异常结果,下游就收到该结果;如果 handle 自己抛了异常,或者返回 null(而泛型不可为空),下游照样走异常路径。这点和 exceptionally 行为对齐,但容易因命名产生误解。

事情说清了就结束
本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。