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

Spring WebClient请求中抛出java.lang.Error的异常处理问题

问题分析

你遇到的问题是Reactor框架的默认行为导致的:Reactor会将Error类型的异常自动包装进ReactiveException中,而RuntimeException则会直接抛出不做包装。这是因为Reactor的设计逻辑里,Error属于系统级严重错误,不应该在响应式流中直接传递,所以会做一层包装处理。

解决方案

要实现抛出自定义的CustomError(继承自Error),你需要在调用block()后手动解包ReactiveException,取出内部的CustomError并重新抛出:

修改后的完整代码

public String fetchData() {
    try {
        return webclient.get()
                .uri(myURI)
                .accept(MediaType.APPLICATION_JSON)
                .retrieve()
                .onStatus(HttpStatus::isError, handleError())
                .bodyToMono(String.class)
                .block();
    } catch (reactor.core.Exceptions.ReactiveException e) {
        Throwable cause = e.getCause();
        if (cause instanceof CustomError) {
            throw (CustomError) cause;
        }
        // 非目标异常,原样抛出
        throw e;
    }
}

private static Function<ClientResponse, Mono<? extends Throwable>> handleError() {
    return response -> response.bodyToMono(String.class)
            .map(CustomError::new);
}

方案说明

  1. 保留原有的onStatus错误处理逻辑,依然通过map将响应体转为CustomError
  2. 在block()外层添加try-catch,捕获Reactor抛出的ReactiveException
  3. 检查异常的根因是否为CustomError,若是则直接抛出,确保测试流程因Error而终止,且用户无法通过catch Exception捕获该错误
  4. 非目标异常保持原样抛出,不影响其他错误的处理逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 16:34:58