关键是在构造 remotecallexception 时显式提取并携带原始 http 响应码,需通过异常类型判断(如 httpclienterrorexception)调用 getstatuscode() 获取,并确保 remotecallexception 含 statuscode 字段及 getter 方法。

在将 HttpClientException 转译为自定义的 RemoteCallException 时,若想保留原始 HTTP 响应码(如 404、500),关键是在构造 RemoteCallException 时显式提取并携带该状态码 —— 这通常需要从原始异常中获取响应对象或其上下文信息。
从 HttpClientException 中提取响应码
多数现代 HTTP 客户端(如 Apache HttpClient、OkHttp 封装、Spring 的 RestClient 或 WebClient)会在异常中保留响应元数据。例如:
- Apache HttpClient 的
HttpResponseException(继承自HttpClientException)直接提供getStatusCode()方法; - Spring Boot 3+ 的
HttpClientErrorException/HttpServerErrorException都有getStatusCode()和getRawStatusCode(); - 若使用的是自定义封装,确保异常构造时已捕获并存储了
HttpStatus或整型状态码。
RemoteCallException 需支持状态码字段
你的 RemoteCallException 应至少包含一个 int statusCode 字段,并提供对应 getter:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
public class RemoteCallException extends RuntimeException {
private final int statusCode;
public RemoteCallException(String message, int statusCode) {
super(message);
this.statusCode = statusCode;
}
public RemoteCallException(String message, Throwable cause, int statusCode) {
super(message, cause);
this.statusCode = statusCode;
}
public int getStatusCode() {
return statusCode;
}
}
转译时正确传递状态码
在异常处理逻辑中(如 try-catch 或全局 @ControllerAdvice),避免只用 new RemoteCallException(e.getMessage()) 这种丢弃状态码的方式:
- 优先尝试向下转型获取状态码:
if (e instanceof HttpClientErrorException hce) { new RemoteCallException(hce.getMessage(), hce.getStatusCode()); } - 若原始异常无直接方法,检查是否可通过
e.getCause()或e.getSuppressed()获取响应对象; - 使用日志或断点确认异常类型,避免误判(例如某些 SDK 把 HTTP 错误包装成通用
IOException,此时需依赖请求上下文中的ResponseEntity或回调参数)。
注意底层客户端的行为差异
不同客户端对异常的封装策略不同:
- Spring
RestTemplate默认抛出HttpClientErrorException等子类,状态码易获取; - Spring
WebClient默认不抛异常,需手动onStatus捕获,此时响应码来自ClientResponse; - Feign 默认将 4xx/5xx 映射为
FeignException,可通过feignResponse.status()提取。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










