You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Mono<A>发生错误时返回Mono<B>类型响应?

解决Reactor错误场景下返回不同类型响应的问题

这个问题是Reactor处理错误恢复的典型场景,你之前用的doOnError/onError属于副作用操作符,只能在错误发生时执行逻辑但无法改变流的最终类型;onErrorMap则是用来转换异常类型,依然会传递错误而非返回目标响应。真正适合的是onErrorResume操作符——它允许你捕获异常后,返回一个全新的、成功的Mono<B>流,完美匹配你的需求。

修改后的代码示例

public Mono<B> someMethod(Object arg) {
    Mono<A> monoA = Mono.just(arg)
            .flatMap(adapter1::doSomething);

    return monoA
            // 成功链路:将A转换为成功响应B
            .map(B::buildSuccessResponse)
            // 错误链路:捕获所有异常,返回错误响应B
            .onErrorResume(throwable -> {
                // 这里可以根据异常类型做针对性处理,比如判断异常 instanceof 特定类型
                B errorResponse = B.buildErrorResponse(throwable.getMessage());
                // 返回包装了错误响应的成功Mono
                return Mono.just(errorResponse);
            });
}

关键细节说明

  • onErrorResume的作用:它是一个恢复操作符,当上游流抛出异常时,会终止原流并执行你提供的逻辑,返回一个新的流。这里我们返回的是包含错误响应B的Mono,所以整个方法的返回类型始终是Mono<B>,无论成功还是错误。
  • 上下文访问:如果你的buildErrorResponse需要用到原始参数arg,直接在onErrorResume的lambda中引用即可(arg是方法参数,属于effectively final,可以直接访问):
    .onErrorResume(throwable -> {
        B errorResponse = B.buildErrorResponse(arg);
        return Mono.just(errorResponse);
    });
    
  • 异常类型过滤:如果你只想处理特定类型的异常,可以用onErrorResume的重载版本,先指定异常类型:
    .onErrorResume(IllegalArgumentException.class, ex -> {
        B errorResponse = B.buildErrorResponse("非法参数:" + ex.getMessage());
        return Mono.just(errorResponse);
    })
    // 可以链式调用处理其他异常
    .onErrorResume(IOException.class, ex -> {
        B errorResponse = B.buildErrorResponse("IO错误:" + ex.getMessage());
        return Mono.just(errorResponse);
    });
    

内容的提问来源于stack exchange,提问作者Sergey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:39:51