推荐继承RuntimeException实现自定义业务异常,需包含statusCode和message两个私有final字段,提供带参构造方法并暴露getStatusCode()等getter;配合@ControllerAdvice统一返回HTTP状态码与JSON响应。

Java 自定义异常类添加错误信息和状态码,核心是继承 Exception(或 RuntimeException)并提供带参构造方法,把消息和状态码作为字段保存,必要时暴露获取方法。
定义包含 message 和 statusCode 的自定义异常
推荐继承 RuntimeException(运行时异常,无需强制 try-catch),同时声明两个私有字段:错误信息(message)和状态码(statusCode)。
示例:
public class BusinessException extends RuntimeException {
private final int statusCode;
// 构造方法:只传状态码(使用默认提示)
public BusinessException(int statusCode) {
this(statusCode, "业务异常");
}
// 构造方法:传状态码和自定义消息
public BusinessException(int statusCode, String message) {
super(message); // 调用父类 Exception(String) 初始化 message
this.statusCode = statusCode;
}
// 可选:提供 getter 方便外部获取状态码
public int getStatusCode() {
return statusCode;
}
}
在业务中抛出并携带具体信息
使用时直接 new 异常并传入状态码和业务错误描述,调用方可通过 getMessage() 获取提示,getStatusCode() 获取码值。
立即学习“Java免费学习笔记(深入)”;
-
抛出异常:
throw new BusinessException(400, "用户名已存在"); -
捕获后处理:
try { // ... 业务逻辑 } catch (BusinessException e) { System.out.println("状态码:" + e.getStatusCode()); System.out.println("提示:" + e.getMessage()); }
配合 Spring Boot 统一响应和全局异常处理(实用场景)
在 Web 项目中,通常搭配 @ControllerAdvice + @ExceptionHandler 统一返回 JSON 格式响应,把自定义异常的状态码和消息透出到 HTTP 层。
例如:
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public ResponseEntity<ApiResponse> handleBusinessException(BusinessException e) {
ApiResponse response = new ApiResponse(e.getStatusCode(), e.getMessage(), null);
return ResponseEntity.status(e.getStatusCode()).body(response);
}
}
这样前端就能拿到标准的 HTTP 400 状态码和 JSON 中的错误信息,实现前后端错误语义对齐。
小贴士:是否需要序列化?是否要记录日志?
如果异常可能被网络传输(如 Dubbo、RPC),建议实现 Serializable;生产环境建议在全局异常处理器里统一打 ERROR 日志,包含堆栈和关键上下文(如用户ID、请求ID)。
不复杂但容易忽略。


















