springboot--异常处理

目录

SpringBoot中异常处理方式

SpringBoot默认的异常处理方式

自定义错误处理页面

@ExceptionHandler处理异常

@ControllerAdvice+@ExceptionHandler注解处理异常

配置SimpleMappingExceptionResolver处理异常

自定义HandlerExceptionResolver类处理异常


SpringBoot中异常处理方式

SpringBoot对异常处理提供了五种方式

  • 自定义错误页面:所有的异常都会跳转到指定的页面
  • @ExceptionHandle注解处理异常:为每一种异常情况都创造一个方法,且为非全局异常处理,只会对当前类产生作用
  • ControllerAdvice+@ExceptionHandler注解处理异常:创建一个特定的类处理异常,为全局异常处理
  • 配置SimpleMappingExceptionResolver处理异常:可将多种异常与页面进行绑定,但页面无法显示异常信息
  • 自定义HandlerExceptionResolver类处理异常:利用判断的方法将异常页面进行绑定,且页面中可以显示异常信息

SpringBoot默认的异常处理方式

当出现异常时SpringBoot默认会向/error的url发送请求。在SpringBoot中提供了一个BasicExceptionController类处理/error请求,该类会跳转到默认错误显示页面显示异常信息。

自定义错误处理页面

  • src/mian/templtes/文件夹下创建一个名称为error的页面,SpringBoot在遇到异常信息时,会跳转到该页面
  • 在error页面中可以用${exception}属性显示异常类型
  • <body>
    <h1>出现了错误,请与管理员联系</h1>
    <!--BasicExceptionController会将错误信息类型封装到exception属性中-->
    <span th:text="${exception}"></span>
  • 这种处理方式将导致所有的异常都会跳转到该页面,对用户不太友好。

@ExceptionHandler处理异常

  • 缺点:需要为多个异常添加方法,是代码产生冗余
  • 在Controller类中添加@ExceptionHandler注解
  •     /**
         * 使用@ExceptionHandler注解表名该方法用来处理异常信息,注解的value属性指明处理异常信息的种类,异常种类用{包裹}
         *      value的值是一个数组,可以添加多个异常种类
         * @param e 将异常信息注入到方法中
         * @return 返回一个ModelAndView用来封装异常信息,并指定视图
         */
        @ExceptionHandler(value = {java.lang.ArithmeticException.class,java.lang.NullPointerException.class})
        public ModelAndView showInfo2(Exception e){
            ModelAndView modelAndView = new ModelAndView();
    //        将异常信息转化成字符串封装到modelAndView中
            modelAndView.addObject("error",e.toString());
    //        指定显示该异常信息的页面为error1
            modelAndView.setViewName("error1");
    //        返回该ModelAndView
            return modelAndView;
        }
  • 在前台显示错误信息
  • <!--去除前台传过来的model值,用以显示错误信息-->
    <span th:text="${error}"></span>

@ControllerAdvice+@ExceptionHandler注解处理异常

  • 创建一个类并加上@ControllerAdvice注解,在该类中使用@ExceptionHandler方法处理异常。这样可以做到项目中产生的所有的异常信息都会被该类处理
  • @ControllerAdvice
    public class GlobalException {
        /**
         * 使用@ExceptionHandler注解表名该方法用来处理异常信息,注解的value属性指明处理异常信息的种类,异常种类用{包裹}
         *      value的值是一个数组,可以添加多个异常种类
         * @param e 将异常信息注入到方法中
         * @return 返回一个ModelAndView用来封装异常信息,并指定视图
         */
        @ExceptionHandler(value = {java.lang.ArithmeticException.class,java.lang.NullPointerException.class})
        public ModelAndView showInfo2(Exception e){
            ModelAndView modelAndView = new ModelAndView();
    //        将异常信息转化成字符串封装到modelAndView中
            modelAndView.addObject("error",e.toString());
    //        指定显示该异常信息的页面为error1
            modelAndView.setViewName("error1");
    //        返回该ModelAndView
            return modelAndView;
        }
    }

配置SimpleMappingExceptionResolver处理异常

  • 此种方式的缺点是:只能异常种类跳转到对应的显示页面,但不能显示异常信息。
  • 创建一个类,在类上加上@Configuration注解用来标明该类是配置类。创建一个方法,在方法上加上@Bean注解,此方法的返回值应当是SimpleMappingExceptionResolver。
  • 在方法中将异常种类与显示页面进行绑定
  • //该注解说明该类是一个配置类,SpringBoot在启动时会对添加了@Configuration的类进行处理
    @Configuration
    public class GlobalException {
    
        @Bean
    //    SpringBoot会对所有添加了@Configuration的类中添加@Bean的方法进行执行
        public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver(){
            SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver();
            Properties properties = new Properties();
    //        将异常信息与显示异常信息的页面进行配对
            properties.setProperty("java.lang.ArithmeticException","error1");
            properties.setProperty("java.lang.NullPointerException","error1");
    //        将properties放进simpleMappingExceptionResolver中
            simpleMappingExceptionResolver.setExceptionMappings(properties);
            return simpleMappingExceptionResolver;
        }
    
    }

自定义HandlerExceptionResolver类处理异常

  • 自定义一个类,为该类加上@Configuration注解,并且实现HandlerExceptionResolver接口
  • //该注解说明该类是一个配置类,SpringBoot在启动时会对添加了@Configuration的类进行处理
    @Configuration
    public class GlobalException implements HandlerExceptionResolver {
    
        @Override
        public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
            ModelAndView modelAndView = new ModelAndView();
    //        判断异常属于哪一类,根据不同的种类跳转到不同的页面
            if (e instanceof ArithmeticException){
                modelAndView.addObject("error",e.toString());
                modelAndView.setViewName("error1");
            }
            if (e instanceof NullPointerException){
                modelAndView.addObject("error",e.toString());
                modelAndView.setViewName("error1");
            }
            return modelAndView;
        }
    }

猜你喜欢

转载自blog.csdn.net/zyp1376308302/article/details/82788515