常见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的兜底处理,防止漏网之鱼。
- 有
-
自定义异常
-
处理特定业务逻辑错误。
-
-
优先处理特定异常
-
如
MethodArgumentNotValidException、HttpMessageNotReadableException,再用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 | 乐观锁冲突 | 提示数据已被修改 |

浙公网安备 33010602011771号