Spring Boot 项目中优雅处理异常的几种方式

James Park | 2026-09-10T22:51:00 | Java, Spring Boot

异常处理是 Spring Boot 项目里最容易被忽视但又最重要的部分。整理了几种常用的异常处理方式和最佳实践。

刚开始写 Spring Boot 项目的时候,异常处理就是到处 try-catch,代码里全是 catch 块。后来学到了更优雅的方式,整理一下。 ## 方式一:全局异常处理器 这是最推荐的方式。用 `@RestControllerAdvice` + `@ExceptionHandler` 统一处理: ```java @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(BusinessException.class) public Result handleBusiness(BusinessException e) { return Result.fail(e.getCode(), e.getMessage()); } @ExceptionHandler(MethodArgumentNotValidException.class) public Result handleValidation(MethodArgumentNotValidException e) { String msg = e.getBindingResult().getFieldErrors().stream() .map(f -> f.getField() + ": " + f.getDefaultMessage()) .collect(Collectors.joining(", ")); return Result.fail(400, msg); } @ExceptionHandler(Exception.class) public Result handleUnknown(Exception e) { log.error("Unexpected error", e); return Result.fail(500, "服务器内部错误"); } } ``` 好处是 Controller 里完全不需要写 try-catch,只管抛异常就行。 ## 方式二:自定义业务异常 定义一个业务异常类,带错误码: ```java @Getter public class BusinessException extends RuntimeException { private final int code; public BusinessException(int code, String message) { super(message); this.code = code; } public static BusinessException notFound(String entity) { return new BusinessException(404, entity + " not found"); } public static BusinessException forbidden(String reason) { return new BusinessException(403, reason); } } ``` Service 层直接抛: ```java public User getUser(Long id) { return userMapper.selectById(id) .orElseThrow(() -> BusinessException.notFound("User")); } ``` ## 方式三:参数校验异常 配合 `@Valid` 注解做参数校验,校验失败的异常也交给全局处理器处理: ```java @PostMapping("/users") public Result create(@Valid @RequestBody CreateUserDTO dto) { // 不需要手动校验,参数不合法直接抛 MethodArgumentNotValidException return Result.ok(userService.create(dto)); } ``` ## 最佳实践 1. **Controller 层不要写 try-catch**,让全局处理器统一处理 2. **区分业务异常和系统异常**:业务异常(参数错误、权限不足)返回明确的错误信息;系统异常(数据库挂了)返回通用错误,不暴露内部细节 3. **异常日志要分级**:业务异常 WARN,系统异常 ERROR 4. **不要用异常做流程控制**:异常是异常,不是 if-else 的替代品

← Back to Blog