springBoot对于处理异常提供了五种方式
一、自定义错误页面
SpringBoot默认提供了一个异常处理机制,出现异常后,springboot会向“/error”的url发送请求。在springboot中提供一个叫做BasicExceptionController来处理/error请求,然后跳转至异常的显示页面来显示异常信息。默认的异常页面如下:
这时的错误提示页面很不友好,可以自定义一个错误提示页面。
就是在templates目录下新建一个error.html来代替默认的页面。这时的名称必须得叫error
二、@ExceptionHandle注解处理异常
这种方法将异常处理直接卸载controller类里,对于不同的异常写不同的处理方法。
缺点:
- 有很多异常的时候要加很多方法,而且异常处理卸载Controller类里显得很不舒服。
- 一个controller里处理异常的方法不能用于处理其他controller里的方法。
/**
* @Auther: kangjia
* @Date: 2019/5/31 9:16
* @Description:
*/
@Controller
public class DemoController {
@RequestMapping("/show")
public String show1(){
int a = 1 / 0;
return "index";
}
@RequestMapping("/show2")
public String show2(){
String a = null;
a.length();
return "index";
}
/**
* 参数Exception e:会将产生的异常对象送到方法中。
* @param e
* @return
*/
@ExceptionHandler(value = {java.lang.ArithmeticException.class})
public ModelAndView exceptionHandler(Exception e){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg", e.toString());
modelAndView.setViewName("index");
return modelAndView;
}
/**
* 参数Exception e:会将产生的异常对象送到方法中。
* @param e
* @return
*/
@ExceptionHandler(value = {java.lang.NullPointerException.class})
public ModelAndView exceptionHandler2(Exception e){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg", e.toString());
modelAndView.setViewName("index");
return modelAndView;
}
}
三、@ControllerAdvice和@ExcptionHandler注解处理异常
全局异常处理。可单独新建一个包,专门用于异常处理。添加@ControllerAdvice注解。
- 新建包,exception;
- 在包下新建类GlobalException.java,
- 在类上添加@ControllerAdvice注解,
- 将上述Controller里的两个处理异常的方法复制进来。
这样该类就可以扫描所有Controller类的异常信息,具有全局异常处理的效果。
/**
* @Auther: kangjia
* @Date: 2019/5/31 9:35
* @Description:
*/
@ControllerAdvice
public class GlobalException {
/**
* 参数Exception e:会将产生的异常对象送到方法中。
* @param e
* @return
*/
@ExceptionHandler(value = {java.lang.ArithmeticException.class})
public ModelAndView exceptionHandler(Exception e){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg", e.toString());
modelAndView.setViewName("index");
return modelAndView;
}
/**
* 参数Exception e:会将产生的异常对象送到方法中。
* @param e
* @return
*/
@ExceptionHandler(value = {java.lang.NullPointerException.class})
public ModelAndView exceptionHandler2(Exception e){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg", e.toString());
modelAndView.setViewName("index");
return modelAndView;
}
}
四、配置SimpleMappingExceptionResolver处理异常
这种方式 是对第三个方法的一种简化。同样有GlobalException类,代码如下:
/**
* @Auther: kangjia
* @Date: 2019/5/31 9:35
* @Description:
*/
@Configuration
public class GlobalException {
@Bean
public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver(){
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
Properties mappings = new Properties();
/**
* 参数一:异常的类型,这里必须要异常类型的全名
* 参数二:要跳转的视图名称
*/
mappings.put("java.lang.ArithmeticException", "errorMsg1");
mappings.put("java.lang.NullPointerException", "errorMsg2");
// 设置异常与视图的映射信息
resolver.setExceptionMappings(mappings);
return resolver;
}
}
缺点是不能得到具体的异常信息
五、自定义HandlerExceptionResolver类处理异常
原理:通过实现HandlerExceptionResolver接口来实现异常处理。实现其中的resolveException方法。
/**
* @Auther: kangjia
* @Date: 2019/5/31 9:35
* @Description:
*/
@Configuration
public class GlobalException implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView mav = new ModelAndView();
// 判断不同异常类型,做不同的视图跳转
if (e instanceof ArithmeticException){
mav.setViewName("index1");
}
if (e instanceof NullPointerException){
mav.setViewName("index2");
}
mav.addObject("errorMsg", e.toString());
return mav;
}
}