onerrorcontinue是reactor 3.4+的错误处理操作符,用于捕获指定类型异常、执行自定义逻辑后跳过当前元素继续流处理,需精准匹配异常类型或用lambda细粒度判断,且仅对上游操作符内抛出的异常生效。

onErrorContinue 是 Reactor 3.4+ 引入的错误处理操作符,它允许在流中某个元素处理失败时捕获异常、执行自定义逻辑(如日志记录),然后跳过该元素,继续处理后续元素。它**不是用来“忽略所有异常”**,而是有选择地处理特定异常并让流继续 —— 关键在于**精准匹配异常类型或条件**。
只捕获特定自定义异常
最常用方式是传入异常类型参数(Class),Reactor 会自动检查是否为该类型或其子类:
- 定义你的自定义异常,比如
InvalidInputException - 在
onErrorContinue中直接指定该类:.onErrorContinue(InvalidInputException.class, (error, data) -> log.warn("跳过非法输入: {}", data)) - 只有抛出
InvalidInputException(或其子类)时才会触发该处理器;其他异常(如NullPointerException)仍会中断流(除非另有兜底)
用 lambda 做细粒度判断
如果需要更复杂的判定逻辑(比如只忽略带特定错误码的异常),可用双参数 lambda:
使用 @ainative/react-sdk 为 React 应用添加 AI 聊天和积分。适用于 (1) 安装 @ainative/react-sdk,(2) 使用 useChat hook 实现聊天完成。
- 签名:
(Throwable error, Object data) -> void - 示例:只忽略
BusinessException中errorCode == 1001的情况.onErrorContinue((err, data) -> {<br> if (err instanceof BusinessException be && be.getErrorCode() == 1001) {<br> log.debug("忽略业务异常 {}", be.getMessage());<br> } else {<br> throw Exceptions.propagate(err); // 非目标异常仍向上抛<br> }<br> })
注意作用域和数据上下文
onErrorContinue 捕获的是**当前操作符链中上游某一步抛出的异常**,且 data 参数是触发异常的那个元素(即导致异常的输入项):
- 它只对直接上游(比如
map、flatMap)中抛出的异常生效 - 若异常来自
flatMap内部的 Mono/Flux,需确保该内部流也配置了 onErrorContinue 或正确传播 - 常见陷阱:在
doOnNext中抛异常 → 能被捕获;但在subscribe回调里抛 → 不在流内,无法被 onErrorContinue 捕获
配合 retry 或 fallback 更稳健
onErrorContinue 本身不重试,只是跳过。如需“重试 + 失败后跳过”,可组合使用:
- 先用
retryWhen尝试有限次 - 最终失败再由
onErrorContinue接管.flatMap(item -> service.process(item)<br> .retryWhen(Retry.backoff(2, Duration.ofMillis(100)))<br> .onErrorContinue(CustomRetryException.class, (e, i) -> log.info("重试耗尽,跳过: {}", i)))
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










