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;
    }
}

 

posted @ 2019-06-02 18:15  Cool_Yang  阅读(280)  评论(0编辑  收藏  举报