当Spring MVC应用程序在运行时遇到异常时,异常可能会向上冒泡,直到Spring MVC Controller方法或其他自定义组件覆盖了异常,而且可能会向客户端返回带有不必要的技术信息的HTTP响应。为了防止这种情况的发生,Spring MVC提供了多种机制来处理异常:
1. 在控制器方法中的try catch块中捕获并处理异常
在控制器方法中使用 try catch 块捕获异常,处理异常并返回适当的错误视图。例如:
@Controller
public class MyController {
@RequestMapping("/do-something")
public String handleRequest() {
try {
//执行某些操作
} catch (MyException ex) {
//处理特定异常
return "error-view";
} catch (Exception ex) {
//处理所有其他异常
return "error-view";
}
return "success-view";
}
}
此方式的缺点: 无法重复使用异常处理逻辑,容易造成代码冗余,对于全局异常处理不友好。
2. 自定义异常类和@RestControllerAdvice注解
我们可以创建自定义异常类,从而使我们能够定义多个不同的异常类,然后可以使用@ControllerAdvice注解处理多个异常类型。使用@RestControllerAdvice注解处理异常,可以使其同时支持映射到JSON和XML响应。当有异常发生时,它将由相应的异常处理程序处理。
此方式的优点:具有更好的代码整洁性,并且可以用于在整个应用程序范围内映射异常。示例如下:
@RestControllerAdvice
public class UserControllerAdvice {
@ExceptionHandler(value = UserNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String handleUserNotFoundException(UserNotFoundException ex) {
return ex.getMessage();
}
@ExceptionHandler(value = EmailExistException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleEmailExistException(EmailExistException ex) {
return ex.getMessage();
}
}
3. @ControllerAdvice和@ExceptionHandler注解结合,通过@ControllerAdvice进行全局异常处理
我们可以创建一个异常处理程序类,该类使用@ControllerAdvice注解和@ExceptionHandler注解中的值来处理特定的异常类型。使用@ControllerAdvice处理异常,可以使其同时支持映射到JSON和XML响应。当有异常发生时,它将被相应的异常处理程序捕获并处理。
此方式的优点:通过@ControllerAdvice,可以全局捕获执行过程中的异常并进行处理,并重载@ExceptionHandler来匹配不同的异常。示例如下:
@ControllerAdvice
public class ExceptionControllerAdvice {
@ExceptionHandler(Exception.class)
public ModelAndView handleException(Exception e) {
ModelAndView mav = new ModelAndView("error");
mav.addObject("exception", e);
return mav;
}
@ExceptionHandler(NoHandlerFoundException.class)
public ModelAndView handleNoHandlerFoundException(HttpServletRequest req, Exception e) {
ModelAndView mav = new ModelAndView("404");
mav.addObject("url", req.getRequestURL());
mav.addObject("exception", e);
return mav;
}
@ExceptionHandler(AccessDeniedException.class)
public ModelAndView handleAccessDeniedException(HttpServletRequest req, Exception e) {
ModelAndView mav = new ModelAndView("403");
mav.addObject("url", req.getRequestURL());
mav.addObject("exception", e);
return mav;
}
}
以上即是Spring MVC中异常处理的三种方式,分别是在控制器方法中的try catch块中捕获并处理异常、自定义异常类和@RestControllerAdvice注解,@ControllerAdvice和@ExceptionHandler注解结合,通过@ControllerAdvice进行全局异常处理。其中,@RestControllerAdvice与@RestController结合使用,@ControllerAdvice与@Controller结合使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring MVC中异常处理的三种方式 - Python技术站