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); }
方案说明
- 保留原有的
onStatus错误处理逻辑,依然通过map将响应体转为CustomError - 在
block()外层添加try-catch,捕获Reactor抛出的ReactiveException - 检查异常的根因是否为
CustomError,若是则直接抛出,确保测试流程因Error而终止,且用户无法通过catch Exception捕获该错误 - 非目标异常保持原样抛出,不影响其他错误的处理逻辑
内容的提问来源于stack exchange,提问作者Rafael Zucareli
相关产品推荐
相关产品推荐

