SpringBoot中的异常处理方式

  • 自定义错误页面
  • @ExceptionHandle注解处理异常
  • @ControllerAdvice + @ExceptionHandle注解处理异常
  • 配置SimpleMappingExceptionResolver处理异常
  • 自定义HandleExceptionResolver类处理异常


1 自定义错误页面

1.1 SpringBoot的默认异常机制详解

    SpringBoot默认的异常机制:SpringBoot默认已经提供了一套处理异常的机制。  
    一旦程序中出现了异常,SpringBoot会向/error的url发送请求。在SpringBoot中提供了一个  
    叫BasicExceptionController来处理/error请求,然后跳转到默认显示的页面来展示异常信息。   

1.2 自定义错误界面

如果我们需要将所有的异常统一跳转到自定义错误页面,需要在classpath下创建一个templates目录(即在resources目录下创建templates目录),在该目录下创建一个名为error.html的页面。

2 基于@ExceptionHandler注解处理异常

2.1 创建指定处理的异常

    /**  
     *java.lang.ArithmeticException  
     *该方法需要返回一个ModelAndView:目的是可以让我们封装异常信息以及视图的指定  
     *参数Exceptione:会将产生异常对象注入到方法中  
     */  
    @ExceptionHandler(value={java.lang.ArithmeticException.class})    
    publicModelAndViewarithmeticExceptionHandler(Exceptione){  
        ModelAndViewmv=newModelAndView();  
        mv.addObject("error",e.toString());  
        mv.setViewName("error1");  
        returnmv;  
    }  

    /**  
      *java.lang.NullPointerException  
      *该方法需要返回一个ModelAndView:目的是可以让我们封装异常信息以及视图的指定  

      *参数Exceptione:会将产生异常对象注入到方法中  
      **/  
    @ExceptionHandler(value={java.lang.NullPointerException.class})    
    publicModelAndViewnullPointerExceptionHandler(Exceptione){  
        ModelAndViewmv=newModelAndView();  
        mv.addObject("error",e.toString());  
        mv.setViewName("error2");  
        return mv;  
    }  

2.2 使用该方法的总结

使用@ExceptionHandler注解处理异常时,首先编写异常页面error.html,其次创建Controller类,编写基于注解@ExceptionHandle注解的方法,并且在该方法中必须指定想要助理异常的名称如上面的java.lang.NullPointerException.class、java.lang.ArithmeticException.class。

3 使用@ControllerAdvice + @ExceptionHandler注解处理异常

3.1 创建一个全局异常类使用ControllerAdvice注解

        /**
         *全局异常处理类
         **/
        @ControllerAdvice
        public class GlobalException {
            /**
             * java.lang.ArithmeticException
             * 该方法需要返回一个ModelAndView:目的是可以让我们封装异常信息以及视图的指定
             * 参数Exceptione:会将产生异常对象注入到方法中
             **/
            @ExceptionHandler(value = {java.lang.ArithmeticException.class})
            public ModelAndView arithmeticExceptionHandler(Exceptione) {
                ModelAndViewmv = newModelAndView();
                mv.addObject("error", e.toString());
                mv.setViewName("error1");
                returnmv;
            }

            /**
             * java.lang.NullPointerException
             * 该方法需要返回一个ModelAndView:目的是可以让我们封装异常信息以及视图的指定
             * 参数Exceptione:会将产生异常对象注入到方法中
             **/
            @ExceptionHandler(value = {java.lang.NullPointerException.class})
            public ModelAndView nullPointerExceptionHandler(Exceptione) {
                ModelAndViewmv = newModelAndView();
                mv.addObject("error", e.toString());
                mv.setViewName("error2");
            }
        }

3.1.1 创建时首先定义一个使用@ControllerAdvice注解的类

3.1.2 在类中使用@ExceptionHandler注解标识需要处理的异常

总结:使用@ControllerAdvice + @ExceptionHandler注解可以解决全局问题。

4 配置SimpleMappingExceptionResolver处理异常

4.1 创建一个使用@Configuration注解的全局类GlobalException类

4.2 在该类中创建一个@Ben注解的方法,返回值为SimpleMappingExceptionResolver的方法,在该方法体中添加需要处理的异常即可

       /**
         *通过SimpleMappingExceptionResolver做全局异常处理
         **/
        @Configuration
        public class GlobalException {
            /**
             * 该方法必须要有返回值。返回值类型必须是:SimpleMappingExceptionResolver
             **/
            @Bean
            public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver() {
                SimpleMappingExceptionResolverresolver = newSimpleMappingExceptionResolver();
                Propertiesmappings = newProperties();
                /**
                 * 参数一:异常的类型,注意必须是异常类型的全名
                 * 参数二:视图名称
                 **/
                mappings.put("java.lang.ArithmeticException", "error1");
                mappings.put("java.lang.NullPointerException", "error2");
                //设置异常与视图映射信息的
                resolver.setExceptionMappings(mappings);
                return resolver;
            }
        }    

5 自定义HandleExceptionResolver类处理异常

5.1 创建一个使用@Configuration标识的类,并实现HandleExceptionResolver接口

5.2 在该接口中重写resolveException方法,在该方法体中标明异常跳转的error页面即可

        /**
         *通过实现HandlerExceptionResolver接口做全局异常处理
         **/
        @Configuration
        public class GlobalExceptionimplementsHandlerExceptionResolver{
            @Override
            public ModelAndView resolveException(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex){
                ModelAndViewmv=newModelAndView();
                //判断不同异常类型,做不同视图跳转
                if(exinstanceofArithmeticException){
                    mv.setViewName("error1");
                }
                if(exinstanceofNullPointerException){
                    mv.setViewName("error2");
                }
                mv.addObject("error",ex.toString());
                return mv;
            }
        }