目录
@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; } }