定义CustomException类继承RuntimeException,用于封装业务异常;在业务逻辑中根据规则抛出带错误码的BusinessException;通过@ControllerAdvice和@ExceptionHandler实现全局捕获并返回结构化JSON;可选结合MessageSource支持国际化。

在Java开发中,为了更清晰地表达业务逻辑中的异常情况,通常会通过自定义异常类(CustomException)来处理业务异常。相比直接使用系统内置异常(如RuntimeException),自定义异常能提高代码可读性、便于维护,并支持携带更丰富的错误信息。
1. 定义CustomException类
创建一个继承自Exception或RuntimeException的自定义异常类。如果希望强制调用方处理异常,应继承Exception;若为运行时异常,可继承RuntimeException。
public class BusinessException extends RuntimeException {
private String errorCode;
public BusinessException(String message) {
super(message);
}
public BusinessException(String errorCode, String message) {
super(message);
this.errorCode = errorCode;
}
public String getErrorCode() {
return errorCode;
}
}
2. 在业务逻辑中抛出CustomException
在服务层或业务方法中,根据具体业务规则判断是否需要中断流程并抛出异常。
示例:用户注册时检查用户名唯一性public class UserService {
private UserRepository userRepository;
public void registerUser(String username, String password) {
if (username == null || username.trim().isEmpty()) {
throw new BusinessException("INVALID_USERNAME", "用户名不能为空");
}
if (userRepository.existsByUsername(username)) {
throw new BusinessException("USERNAME_EXISTS", "该用户名已被占用");
}
// 执行注册逻辑
User user = new User(username, password);
userRepository.save(user);
}
}
3. 统一异常处理机制
结合Spring框架的@ControllerAdvice和@ExceptionHandler实现全局异常捕获,避免异常信息直接暴露给前端。
立即学习“Java免费学习笔记(深入)”;
示例:全局异常处理器@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseBody
@ExceptionHandler(BusinessException.class)
public ResponseEntity
这样,当任何控制器中抛出BusinessException时,都会被统一拦截并返回结构化JSON响应。
4. 异常编码与国际化支持(可选)
为提升系统健壮性和多语言支持能力,可以将错误码与资源文件关联。例如:
- 定义properties文件:
messages_zh_CN.properties - 内容:
USERNAME_EXISTS=该用户名已被占用 - 加载时根据Locale返回对应语言提示
结合MessageSource在异常处理器中动态获取提示信息。
基本上就这些。通过定义CustomException并在业务中合理抛出,配合统一处理机制,能够有效管理Java应用中的业务异常,提升用户体验和系统可维护性。










