Spring MVC提供的全局异常处理方式:
1、使用 Spring MVC 提供的简单异常处理器 SimpleMappingExceptionResolver
2、实现 Spring 的异常处理接口 HandlerExceptionResolver 自定义自己的异常处理器
3、使用 @ExceptionHandler 注解实现异常处理

简单异常处理器

springmvc 中自带了一个异常处理器叫 SimpleMappingExceptionResolver,该处理器实现了HandlerExceptionResolver 接口,全局异常处理器都需要实现该接口

使用 xml 文件配置 SimpleMappingExceptionResolver 对象:

  1. <!-- springmvc提供的简单异常处理器 -->
  2. <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
  3. <!-- 定义默认的异常处理页面 -->
  4. <property name="defaultErrorView" value="/WEB-INF/views/error.jsp"/>
  5. <!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception -->
  6. <property name="exceptionAttribute" value="ex"/>
  7. <!-- 定义需要特殊处理的异常,这是重要点 -->
  8. <property name="exceptionMappings">
  9. <props>
  10. <!-- 指定最定义异常所在的包 -->
  11. <prop key="com.example.exception.CustomException">/WEB-INF/views/custom_error.jsp</prop>
  12. </props>
  13. <!-- 还可以定义其他的自定义异常 -->
  14. </property>
  15. </bean>

在异常页面获取异常信息:${ex}

定义一个简单的异常类:

  1. //定义一个简单的异常类
  2. public class ParamException extends RuntimeException {
  3. private String message = "参数异常!";
  4. public ParamException(){
  5. super("参数异常!");
  6. }
  7. public ParamException(String message) {
  8. super(message);
  9. this.message = message;
  10. }
  11. public String getMessage() {
  12. return message;
  13. }
  14. public void setMessage(String message) {
  15. this.message = message;
  16. }
  17. }

使用 Java 配置类配置:

  1. @Bean
  2. public HandlerExceptionResolver simpleMappingExceptionResolver() {
  3. SimpleMappingExceptionResolver exceptionResolver = new SimpleMappingExceptionResolver();
  4. // 设置默认异常处理映射
  5. exceptionResolver.setDefaultErrorView("/WEB-INF/views/error.jsp");
  6. // 设置自定义异常处理映射:通过属性配置
  7. Properties properties = new Properties();
  8. properties.setProperty("com.example.exception.BusinessException", "/WEB-INF/views/biz.jsp")
  9. exceptionResolver.setExceptionMappings(properties);
  10. return exceptionResolver;
  11. }

实现 HandlerExceptionResolver 接口

  1. @Component
  2. public class MyExceptionHandler implements HandlerExceptionResolver {
  3. @Override
  4. public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
  5. System.out.println("异常标记");
  6. ModelAndView modelAndView = new ModelAndView();
  7. if (ex instanceof ArithmeticException){
  8. modelAndView.setViewName("error");
  9. modelAndView.addObject("msg", ex.getMessage());
  10. } else {
  11. modelAndView.setViewName("index");
  12. modelAndView.addObject("msg", ex.getMessage());
  13. }
  14. return modelAndView;
  15. }
  16. }

使用 @ExceptionHandler 注解

  • @ExceptionHandler 注解:统一处理某一类异常
  • @ControllerAdvice:异常集中处理,更好的使业务逻辑与异常处理分开
  • @ResponseStatus:将某种异常映射为HTTP状态码

使用 @ControllerAdvice 和 @ExceptionHandler 注解结合使用
官方文档:https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#webmvc-fn