常见springboot异常处理器

当前项目中基本操作都是业务中抛出异常,由全局异常处理@RestControllerAdvice + @ExceptionHandler抓取并处理。常见异常处理器:

  •  MethodArgumentNotValidException(验证异常)   
    • 触发条件:`@Valid` 注解验证失败时触发,适用于 `@RequestBody` 或 `@ModelAttribute` 的输入验证。
@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<String> handleValidationExceptions(MethodArgumentNotValidException ex) {
        StringBuilder errors = new StringBuilder();
        for (FieldError error : ex.getBindingResult().getFieldErrors()) {
            errors.append(error.getField()).append(": ").append(error.getDefaultMessage()).append("; ");
        }
        return new ResponseEntity<>(errors.toString(), HttpStatus.BAD_REQUEST);
    }
}

  典型场景

    -统一处理用户提交的表单或 JSON 数据验证失败。
    - 返回详细的字段验证错误信息,适用于所有 API 端点。

  •  HttpMessageNotReadableException(JSON 解析异常)
    • 触发条件:求的 JSON 数据格式错误或类型不匹配时触发
1 public class GlobalExceptionHandler {
2     @ExceptionHandler(HttpMessageNotReadableException.class)
3     public ResponseEntity<String> handleHttpMessageNotReadable(HttpMessageNotReadableException ex) {
4         return new ResponseEntity<>("Invalid JSON format: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
5     }
6 }

  典型场景

    - 处理前端发送的无效 JSON 数据。
    - 提示用户请求格式错误,提升 API 鲁棒性。

  • ResponseStatusException(状态码异常)
    • 触发条件:手动抛出 `ResponseStatusException`,直接指定 HTTP 状态码和错误消息。

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(ResponseStatusException.class)
    public ResponseEntity<String> handleResponseStatusException(ResponseStatusException ex) {
        return new ResponseEntity<>("Error: " + ex.getReason(), ex.getStatusCode());
    }
}

  典型场景

    - 统一处理业务逻辑中抛出的状态码异常,如 404 Not Found 或 403 Forbidden。

  • SQLIntegrityConstraintViolationException  (数据库约束异常)
    • 触发条件:处理数据库操作违反唯一约束、外键约束等情况
@ExceptionHandler(SQLIntegrityConstraintViolationException.class)
public Result handleSQLIntegrityConstraintViolationException(SQLIntegrityConstraintViolationException e) {
    ...
    log.error("数据库约束异常: " + errorMessage);
    return Result.error(ErrorCode, errorMessage);
}

  典型场景

    - 处理数据库插入数据时异常

  • ConstraintViolationException (方法参数校验异常@Validated)
    • 处理在 参数校验(@Validated)时,违反约束的异常。
    • 常用于 @RequestParam@PathVariable 参数的校验。
@ExceptionHandler(ConstraintViolationException.class)
public Result handleValidationException(ConstraintViolationException e) {
    log.error("参数验证异常: " + errorMessage);
    return Result.error(ErrorCode, Msg;
}

  

全局异常设计

  • 统一错误码管理

    • 使用 ErrorCodeConstant 或枚举统一管理。
  • 固定返回信息,详细记录日志

    • 避免将堆栈信息暴露给前端。
  • 兜底异常

    • Exception.class 的兜底处理,防止漏网之鱼。
  • 自定义异常

    • 处理特定业务逻辑错误。

  • 优先处理特定异常

    • MethodArgumentNotValidExceptionHttpMessageNotReadableException,再用 Exception 作为兜底。

  • 确保错误响应格式一致

    • 如 JSON 结构,便于前端解析。

 

附异常类型快速对照表:

异常类型触发场景常见处理方法
MethodArgumentNotValidException Bean 参数校验失败(JSON 体) 提取第一个错误或错误列表
SQLIntegrityConstraintViolationException 数据库唯一/外键/非空约束冲突 解析 SQL 消息,返回固定错误码
ConstraintViolationException 方法参数校验失败 提取校验消息
BindException 表单参数绑定失败 返回字段错误信息
HttpRequestMethodNotSupportedException HTTP 方法不匹配 提示正确方法
HttpMediaTypeNotSupportedException Content-Type 不匹配 提示支持类型
MissingServletRequestParameterException 缺少请求参数 提示缺失字段
HttpMessageNotReadableException JSON 格式错误 提示解析失败
MaxUploadSizeExceededException 上传文件超限制 提示文件过大
AccessDeniedException 无访问权限 提示权限不足
NoHandlerFoundException URL 不存在 返回 404 JSON
DataIntegrityViolationException 数据库约束冲突 返回固定错误码
OptimisticLockingFailureException 乐观锁冲突 提示数据已被修改
posted @ 2025-08-13 11:22  Marktowin  阅读(10)  评论(0)    收藏  举报