SpringBoot异常处理
1.通过SpringBoot自带的机制处理
Controller控制层代码:
/* 默认处理方式 */ @Controller @RequestMapping("/test") public class NormalController { @RequestMapping("/error1") public @ResponseBody String Error1(){ String str=null; str.length(); return "ok"; } @RequestMapping("/error2") public @ResponseBody String Error2(){ int a=10/0; return "ok"; } }
运行结果:
2.在本类中定义异常信息处理方法:
定义的错误页面,下面的全部用该错误页面:
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.w3.org/1999/xhtml"> <html> <head> <meta charset="UTF-8"> <title>错误提示页面</title> </head> <body> 出错了,请与管理员联系。。。 <span th:text="${error}"></span> </body> </html>
Contoller控制层代码:
/* SpringBoot自定义异常一,自定义错误页面 仅在该类可以使用,定义全局异常请看execption2 */ @Controller @RequestMapping("/exec1") public class Exec1Controller { @RequestMapping("/error1") public @ResponseBody String Error1(){ String str=null; str.length(); return "ok"; } @RequestMapping("/error2") public @ResponseBody String Error2(){ int a=10/0; return "ok"; } /* * java.lang.NullPointerException * 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视图的指定 * 参数 Exception e:会将产生异常对象注入到方法中 */ @ExceptionHandler(value={java.lang.NullPointerException.class}) public ModelAndView nullPointerExceptionHandler(Exception e){ ModelAndView mv = new ModelAndView(); mv.addObject("error",e.toString()); //定义返回的错误信息 mv.setViewName("error11"); //定义返回的错误页面 return mv; } /** * java.lang.ArithmeticException * 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视图的指定 * 参数 Exception e:会将产生异常对象注入到方法中 */ @ExceptionHandler(value = {java.lang.ArithmeticException.class}) public ModelAndView arithmeticExceptionHandler(Exception e){ ModelAndView mv = new ModelAndView(); mv.addObject("error",e.toString()); mv.setViewName("error11"); return mv; } }
运行结果:
3.定义全局异常处理
Controller控制层代码:
/* 自定义处理异常方式二 定义全局异常处理 */ @Controller @RequestMapping("/exec2") public class Exec2Controller { @RequestMapping("/error1") public String Error1(){ String str=null; str.length(); return "ok"; } @RequestMapping("/error2") public String Error2(){ int a=10/0; return "ok"; } }
GlobalException全局异常类代码:
/* 全局异常处理类[处理全局的异常] */ @ControllerAdvice //全局异常标识注解 public class GlobalException { /* * java.lang.NullPointerException * 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视图的指定 * 参数 Exception e:会将产生异常对象注入到方法中 */ @ExceptionHandler(value={java.lang.NullPointerException.class}) public ModelAndView nullPointerExceptionHandler(Exception e){ ModelAndView mv = new ModelAndView(); mv.addObject("error",e.toString()); mv.setViewName("error11"); return mv; } /** * java.lang.ArithmeticException * 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视图的指定 * 参数 Exception e:会将产生异常对象注入到方法中 */ @ExceptionHandler(value = {java.lang.ArithmeticException.class}) public ModelAndView arithmeticExceptionHandler(Exception e){ ModelAndView mv = new ModelAndView(); mv.addObject("error",e.toString()); mv.setViewName("error11"); return mv; } }
4.定义全局异常处理类,控制层代码同上
GlobalException全局异常类代码:
/* 通过 SimpleMappingExceptionResolver 做全局异常处理 只是视图和异常类型的映射,并不会传递参数详细信息。 @Configuration 项目在启动时会首先加载这个类 */ @Configuration public class GlobalException { /* 该方法必须要有返回值。返回值类型必须是:SimpleMappingExceptionResolver */ @Bean //在启动时,会对这个方法进行加载执行 public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver(){ SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver(); Properties mappings = new Properties(); /* 参数一:异常的类型,注意必须是异常类型的全名 参数二:视图名称 没办法传递异常对象 */ mappings.put("java.lang.NullPointerException","error11"); //不同错误,定位到不同页面 mappings.put("java.lang.ArithmeticException","error11"); //设置异常与视图映射信息的 resolver.setExceptionMappings(mappings); return resolver; } }
5.通过继承HandlerExceptionResolver 接口定义全局异常类,控制层代码同上
GlobalException全局异常类代码:
/* 通过实现 HandlerExceptionResolver 接口做全局异常处理 @Configuration 项目在启动时会首先加载这个类 */ @Configuration public class GlobalException implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { ModelAndView mv =new ModelAndView(); //判断不同异常类型,做不同试图跳转 if(e instanceof ArithmeticException){ mv.setViewName("error11"); } if(e instanceof NullPointerException){ mv.setViewName("error11"); } mv.addObject("error",e.toString()); return mv; } }