1.通过自定义错误页面
spring boot默认的处理异常的机制:spring boot默认的提供了一套处理异常的机制,一旦出现程序异常spring
boot会向/error发起请求。在spring boot中提供了一个 叫Base exception
controller的类来处理/error的请求。然后跳转到默认的异常显示页面来展示错误信息。
如果我们需要将所有的统一跳转到自定义的错误页面,需要在/src/main/resources/templates目录下创建error.html页面
。
例如:
@RequestMapping("/show")
public String showInfo() {
System.out.println("come in");
String str = null;
str.length();
return "index.html";
}
@RequestMapping("/show2")
public String showInfo2() {
System.out.println("come in");
int a = 10/0;
return "index.html";
}
中途出了错误会会自动跳转到error页面。
2.@ExceptionHandler注解异常捕获然后处理
参数***Exception会将产生的异常注入到产生的方法中,但是这个注解有个缺点就是只能针对本类中的异常做处理,并不能对整个项目的异常做处理
。
例如:
@ExceptionHandler(value = {java.lang.NullPointerException.class, java.lang.ArithmeticException.class})
public ModelAndView NullPointerException(Exception e) {
System.out.println(e);
ModelAndView mv = new ModelAndView();
mv.addObject("error",e.toString());
mv.addObject("status","500");
mv.setViewName("error1");
return mv;
}
@ExceptionHandler(value = {java.lang.NullPointerException.class})
public ModelAndView NullPointerException(NullPointerException e) {
System.out.println(e);
ModelAndView mv = new ModelAndView();
mv.addObject("error",e.toString());
mv.addObject("status","500");
mv.setViewName("error1");
return mv;
}
3.@ControllerAdvice+@ExceptionHandler结合使用
这种情况是一般项目中普遍使用的异常捕捉方法,这样的话就可以对全局的异常进行捕获,还能对异常进行处理,相对于以上甚至以下的方法都很好用
。
@ControllerAdvice
public class GlobalException {
@ExceptionHandler(value = { java.lang.NullPointerException.class })
public ModelAndView NullPointerException(NullPointerException e) {
System.out.println(e);
ModelAndView mv = new ModelAndView();
mv.addObject("error", e.toString());
mv.addObject("status", "500");
mv.setViewName("error1");
return mv;
}
@ExceptionHandler(value = {java.lang.ArithmeticException.class })
public ModelAndView NullPointerException(ArithmeticException e) {
System.out.println(e);
ModelAndView mv = new ModelAndView();
mv.addObject("error", e.toString());
mv.addObject("status", "500");
mv.setViewName("error1");
return mv;
}
/*@ExceptionHandler(value = { java.lang.NullPointerException.class, java.lang.ArithmeticException.class })
public ModelAndView NullPointerException(Exception e) {
System.out.println(e);
ModelAndView mv = new ModelAndView();
mv.addObject("error", e.toString());
mv.addObject("status", "500");
mv.setViewName("error1");
return mv;
}*/
在具体的应用中,不管原先的方法返回值如何,只要出现异常就会被该注解捕获,原先方法的返回值和该注解的返回值并没有关系,该注解所对应的方法返回的数据前端都收得到。
4.HandlerExceptionResolver全局异常处理类
这种方法有一定的局限性,但是使用起来也很方便,它只能返回ModelAndView对象
。
例如:
@Configuration
public class GlobalException implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
ModelAndView mv = new ModelAndView();
if(ex instanceof NullPointerException) {
mv.setViewName("error");
}
if(ex instanceof ArithmeticException) {
mv.setViewName("error1");
}
mv.addObject("error",ex.toString());
return mv;
}
}
error,error1对应的是/src/main/resources/templates目录下创建error.html页面
简化版的是:
/*
* 该方法必须有返回值,返回值类型为:SimpleMappingExceptionResolver
*
* 有点是简化了前面的方法,但是不能传递异常对象
*/
@Bean
public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver() {
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
Properties mappings = new Properties();
/*
*
* 参数一:异常的类型,注意必须是异常类型的全名
*
* 参数二:跳转到视图的视图名称
*
* */
mappings.put("java.lang.NullPointerException", "error");
mappings.put("java.lang.ArithmeticException", "error1");
resolver.setExceptionMappings(mappings);
return resolver;
}
demo下载:https://download.csdn.net/download/qq_23095607/12376744