onErrorResume 是 Reactor 中在上游 onError 时切换至备用流的操作符,不终止序列、吞掉原错误,仅支持替换而非重试,推荐用于异常兜底而非重试场景。

onErrorResume 是 Reactor 中用于在上游发生错误时切换到备用流(fallback)的核心操作符,它不会终止序列,而是用一个新 Publisher 替换出错的流,继续后续处理。
理解 onErrorResume 的触发时机和行为
它只在上游 Publisher 发出 onError 信号时被调用,接收该异常作为参数,返回一个新的非空 Publisher(不能返回 null)。一旦切换成功,原错误被“吞掉”,下游只会看到备用流的数据和完成信号,不再感知原始异常。
- 如果返回的备用流也报错,且未再处理,错误会向上传播给下游订阅者
- 不能用于“重试”,它不重新订阅原流,只是替换——要重试请用
retry()或retryWhen() - 支持重载:可只传 fallback Publisher(忽略异常),也可传 Function<Throwable, Publisher> 做差异化处理
基础用法:提供静态备用流
最简单场景:无论什么异常,都切到一个固定数据流。
使用 @ainative/react-sdk 为 React 应用添加 AI 聊天和积分。适用于 (1) 安装 @ainative/react-sdk,(2) 使用 useChat hook 实现聊天完成。
Flux.range(1, 5)
.map(i -> {
if (i == 3) throw new RuntimeException("boom");
return i * 2;
})
.onErrorResume(e -> Flux.just(-1, -2))
.subscribe(System.out::println);
// 输出:2, 4, -1, -2
按异常类型定制 fallback
利用 lambda 参数区分异常,返回不同备用逻辑:
立即学习“Java免费学习笔记(深入)”;
- 对网络超时返回缓存值:
e instanceof TimeoutException ? Mono.just(getCachedValue()) : Mono.empty() - 对业务异常返回默认对象:
e instanceof UserNotFoundException ? Mono.just(new User("guest")) : Mono.error(e)(注意:返回Mono.error(e)表示不兜底,继续抛) - 记录日志后再 fallback:
e -> { log.warn("Fallback triggered", e); return Flux.empty(); }
与 onErrorResumeWith 的区别
onErrorResume 是当前推荐写法(Reactor 3.4+),onErrorResumeWith 已标记为 deprecated。两者功能一致,但后者方法签名更旧(接受 Supplier<Publisher>),语义略弱。统一用 onErrorResume 即可。

















