自定义异常类通过继承Exception或RuntimeException实现,用于精准表达业务错误场景。如UserNotFoundException处理用户不存在的情况,InvalidOrderStatusException阻止非法订单状态变更,结合Spring Boot的@ControllerAdvice全局捕获并统一返回HTTP状态码与错误信息,提升系统可维护性。最佳实践包括:命名清晰、提供多构造函数、合理选择受检或非受检异常,并可在异常中携带错误码以支持国际化。团队应建立规范统一使用方式。

在Java中,自定义异常类能够帮助开发者更清晰地表达业务错误场景,提升代码可读性和维护性。Java提供了Exception和RuntimeException等异常基类,我们可以通过继承它们来创建符合业务需求的异常类型。
如何自定义异常类
自定义异常类通常继承Exception(受检异常)或RuntimeException(非受检异常),根据是否强制调用者处理异常来选择。
public class UserNotFoundException extends Exception {
public UserNotFoundException() {
super();
}
public UserNotFoundException(String message) {
super(message);
}
public UserNotFoundException(String message, Throwable cause) {
super(message, cause);
}
}
如果不需要强制捕获,可以继承RuntimeException:
public class InvalidOrderStatusException extends RuntimeException {
public InvalidOrderStatusException(String message) {
super(message);
}
}
自定义异常在业务逻辑中的应用场景
在实际开发中,使用自定义异常能精准定位问题,增强系统的健壮性和可维护性。
立即学习“Java免费学习笔记(深入)”;
-
用户服务中验证用户合法性:当查询用户为空时抛出
UserNotFoundException,调用方可以根据该异常做特定处理,比如返回404状态码。 -
订单状态校验:订单不允许从“已取消”状态变更为“已支付”,此时抛出
InvalidOrderStatusException,阻止非法流转。 -
参数校验失败:例如手机号格式错误,可定义
InvalidPhoneNumberException,便于前端识别错误类型并提示用户。
结合Spring Boot的实际使用建议
在Spring框架中,配合@ControllerAdvice和@ExceptionHandler全局处理自定义异常,统一返回结构。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity handleUserNotFound(UserNotFoundException e) {
return ResponseEntity.status(404).body(e.getMessage());
}
@ExceptionHandler(InvalidOrderStatusException.class)
public ResponseEntity handleInvalidOrder(InvalidOrderStatusException e) {
return ResponseEntity.badRequest().body(e.getMessage());
}
}
这样前端收到响应时,能根据HTTP状态码和消息内容准确判断错误原因。
设计自定义异常的最佳实践
- 异常类名应清晰表达错误语义,如
InsufficientBalanceException比BusinessException更具意义。 - 提供丰富的构造函数,支持传入消息、原因等信息,便于日志追踪。
- 避免过度使用受检异常,对于流程控制类错误,推荐使用运行时异常。
- 可在异常中携带额外信息(如错误码),方便国际化或多系统对接。
基本上就这些。合理使用自定义异常能让业务逻辑更清晰,错误处理更优雅。关键是在项目初期建立规范,团队统一使用方式,才能发挥最大价值。










