关键是在构造 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:
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
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 大师之旅:从入门到精通的终极指南










