Exception Handling in Spring MVC
在 Spring MVC 中,异常处理是一个非常重要的方面,它可以帮助开发者更好地管理应用程序中的错误情况,提供友好的用户反馈,并确保应用程序的稳定性和可维护性。Spring MVC 提供了多种方式来处理异常,包括使用 @ExceptionHandler
注解、HandlerExceptionResolver
接口以及全局异常处理。
1. 使用 @ExceptionHandler
注解
@ExceptionHandler
注解可以用于方法级别,用于处理特定类型的异常。这些方法可以定义在控制器类中,也可以定义在全局异常处理器类中。
示例:在控制器中处理异常
@Controller
public class UserController {
@GetMapping("/user")
public String getUser(@RequestParam("id") Long id, Model model) {
User user = userService.getUserById(id);
model.addAttribute("user", user);
return "user";
}
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
}
}
在这个示例中,handleUserNotFoundException
方法会捕获 UserNotFoundException
异常,并返回一个 HTTP 404 响应。
示例:全局异常处理器
你也可以创建一个全局异常处理器类,用于处理所有控制器中的异常。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
}
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleGeneralException(Exception ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("An error occurred: " + ex.getMessage());
}
}
在这个示例中,GlobalExceptionHandler
类使用了 @ControllerAdvice
注解,表示它是一个全局异常处理器。它定义了两个异常处理方法,分别处理 UserNotFoundException
和其他所有异常。
2. 使用 HandlerExceptionResolver
接口
HandlerExceptionResolver
接口提供了另一种方式来处理异常。你可以实现这个接口,定义自己的异常处理逻辑。
示例:自定义 HandlerExceptionResolver
@Component
public class CustomExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response