BusinessException与GlobalExceptionHandler的使用

BusinessException

这是一个自定义异常类,用于表示业务逻辑相关的异常

使用场景:在业务代码中抛出具体的业务异常

使用方式:

// 在业务代码中抛出异常
if (userExists) {
    throw new BusinessException("4002", "该邮箱已注册");
}

// 或者只传消息
throw new BusinessException("参数错误");

// 或者带上原始异常
try {
    // 某些操作
} catch (Exception e) {
    throw new BusinessException("操作失败", e);
}

GlobalExceptionHandler

这是一个全局异常处理器,用于统一处理所有异常

它会自动捕获所有 Controller 层抛出的异常,并转换为统一的响应格式

使用场景:不需要显式使用,它会自动工作

处理三种类型的异常:

  // 1. 参数验证失败(@Valid 注解验证失败)
  @PostMapping("/register")
  public void register(@Valid @RequestBody UserDTO user) {
      // ...
  }

  // 2. 业务异常(BusinessException)
  if (userExists) {
      throw new BusinessException("4002", "该邮箱已注册");
  }

  // 3. 其他未知异常
  // 所有未处理的异常都会被转换为 500 错误

使用建议

1. 对于可预见的业务错误,使用 BusinessException:

   if (balance < amount) {
       throw new BusinessException("4004", "余额不足");
   }

2. 对于参数验证,使用 @Valid 和验证注解:

   public class UserDTO {
       @NotBlank(message = "邮箱不能为空")
       @Email(message = "邮箱格式不正确")
       private String email;
   }

3. 系统异常(如数据库连接失败)会被自动转换为 500 错误:

   try {
       // 数据库操作
   } catch (SQLException e) {
       throw new BusinessException("5002", "数据库操作失败");
   }

这样的设计可以:

  • 统一异常处理逻辑
  • 提供统一的错误响应格式
  • 区分业务异常和系统异常
  • 方便前端根据错误码进行不同处理

前端会收到统一格式的响应,比如:

{
    "code": "4002",
    "message": "该邮箱已注册"
}

你可能感兴趣的:(Java,java,前端,服务器)