在 Spring Boot 应用中实现统一异常处理是非常重要的,它可以帮助我们更好地管理和响应应用程序中的错误。通过使用 @ControllerAdvice@ExceptionHandler 注解,我们可以创建一个全局的异常处理器来捕获并处理不同类型的异常。

步骤 1: 创建一个异常处理类

首先,我们需要创建一个带有 @ControllerAdvice 注解的类。这个注解使得该类可以作为全局异常处理器,对所有控制器方法中的异常进行处理。

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;

@ControllerAdvice
public class GlobalExceptionHandler {

    // 处理特定异常
    @ExceptionHandler(value = {NullPointerException.class, IllegalArgumentException.class})
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ResponseEntity<String> handleException(Exception e) {
        return new ResponseEntity<>("Error: " + e.getMessage(), HttpStatus.BAD_REQUEST);
    }

    // 处理所有未捕获的异常
    @ExceptionHandler(value = Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ResponseEntity<String> handleAllExceptions(Exception e) {
        return new ResponseEntity<>("An unexpected error occurred: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

步骤 2: 定义自定义异常(可选)

有时候,你可能需要定义自己的异常类型,以便更精确地控制应用的行为。例如:

public class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException(String message) {
        super(message);
    }
}

然后,在你的异常处理类中添加一个新的方法来专门处理这种异常:

@ExceptionHandler(ResourceNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public ResponseEntity<String> handleResourceNotFoundException(ResourceNotFoundException ex) {
    return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
}

步骤 3: 在控制器中抛出异常

在你的控制器中,你可以根据业务逻辑的需要抛出这些异常。例如:

@RestController
public class UserController {

    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        User user = userRepository.findById(id).orElse(null);
        if (user == null) {
            throw new ResourceNotFoundException("User not found with id: " + id);
        }
        return user;
    }
}

总结

通过以上步骤,你可以为 Spring Boot 应用程序设置一个强大的异常处理机制。这不仅有助于提高用户体验,还可以确保应用程序更加健壮和易于维护。使用 @ControllerAdvice@ExceptionHandler 是实现这一目标的有效方式。

11-08 16:06