Springboot的五种异常错误处理方式

一 自定义错误页面

只需要在resources/templates/目录下新建一个名为error的视图页面即可,当出现异常时,SpringBoot 会像/error 的 url 发送请求。在 springBoot 中提供了一个

叫 BasicExceptionController 来处理/error 请求,然后跳转到默认显示异常的页面来展示异常信息。

spring boot 异常处理 aop springboot抛出异常_Springboot


Controller类中

spring boot 异常处理 aop springboot抛出异常_异常处理方法_02


页面中

spring boot 异常处理 aop springboot抛出异常_java_03


效果

spring boot 异常处理 aop springboot抛出异常_java_04


缺点:拦截所有错误,不灵活

二 使用注解@ExceptionHandler处理

在controller类中添加错误类,返回ModelandView,并使用@ExceptionHandler(value={})注解,value中标注错误类型,当发生错误时会自动跳转到你设置的错误页面中

Controller类

@Controller
public class ExceptionController {

    @RequestMapping("/zidingyi")
    public String zidingyi(){
        int i=100/0;
        return "index";
    }

    @RequestMapping("/zidingyi1")
    public String zidingyi1(){
        String str=null;
        str.length();
        return "index";
    }

    //定义错误处理,value中指定错误类型
    @ExceptionHandler(value={java.lang.ArithmeticException.class})
    public ModelAndView exception1(Exception e){
        ModelAndView mv=new ModelAndView();
        mv.addObject("error",e.toString());
        mv.setViewName("error1");
        return mv;
    }

    //定义错误处理,value中指定错误类型
    @ExceptionHandler(value={java.lang.NullPointerException.class})
    public ModelAndView exception2(Exception e){
        ModelAndView mv=new ModelAndView();
        mv.addObject("error",e.toString());
        mv.setViewName("error2");
        return mv;
    }

}

错误页面

页面一
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>这里是ArithmeticException错误页面</title>
</head>
<body>
    发生错误啦 <span th:text="${error}"></span>
</body>
</html>

页面二
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>这里是NullPointerException错误页面</title>
</head>
<body>
    发生错误啦 <span th:text="${error}"></span>
</body>
</html>

缺点:只能在一个controller中使用,不能跨controller使用

三 使用注解@controllerAdvice处理

定义一个类用来装所有的错误类型,并且使用@controllerAdvice注解

spring boot 异常处理 aop springboot抛出异常_Exception_05


Controller类

spring boot 异常处理 aop springboot抛出异常_java_06


AllException类

package com.ht.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

/**
 * Created by wqx on 2019/3/20.
 */
@ControllerAdvice
public class AllException {
    @ExceptionHandler(value={java.lang.ArithmeticException.class})
    public ModelAndView exception1(Exception e){
        ModelAndView mv=new ModelAndView();
        mv.addObject("error",e.toString());
        mv.setViewName("error1");
        return mv;
    }

    //定义错误处理,value中指定错误类型
    @ExceptionHandler(value={java.lang.NullPointerException.class})
    public ModelAndView exception2(Exception e){
        ModelAndView mv=new ModelAndView();
        mv.addObject("error",e.toString());
        mv.setViewName("error2");
        return mv;
    }

}

缺点:如果有多个错误还是要写多个方法,代码重复严重

四 使用@Configuration注解处理

新建类,在类中使用@Configuration注解,在类中定义方法,方法使用@Bean注解,并且返回值为:SimpleMappingExceptionResolver

spring boot 异常处理 aop springboot抛出异常_java_07


AllException2类:

package com.ht.exception;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;

import java.util.Properties;

/**
 * Created by wqx on 2019/3/20.
 */
//第四种方法:使用@Configuration注解和@Bean注解,将所有的错误都定义到一个方法中,发生错误时,
// 会根据判断自动跳转到指定错误页面
@Configuration
public class AllException2 {

    // 该方法必须要有返回值。返回值类型必须是:SimpleMappingExceptionResolver

     @Bean
    public SimpleMappingExceptionResolver toexception(){
        SimpleMappingExceptionResolver resolver=new SimpleMappingExceptionResolver();
         Properties mapping=new Properties();
         //参数一:错误类型 参数二:指定跳转的错误页面
         mapping.put("java.lang.ArithmeticException","error1");
         mapping.put("java.lang.NullPointerException","error1");
         resolver.setExceptionMappings(mapping);
         return resolver;
    }

}

Controller类

package com.ht.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

/**
 * Created by wqx on 2019/3/20.
 */

@Controller
public class ExceptionController {

    @RequestMapping("/zidingyi")
    public String zidingyi(){
        int i=100/0;
        //第一种方法:自定义错误页面,发生错误时自动跳转,页面名称必须为error,放在templates目录下
        return "index";
    }

    @RequestMapping("/zidingyi1")
    public String zidingyi1(){
        String str=null;
        str.length();
        return "index";
    }

缺点:不能将错误信息传递到页面中

五 自定义 HandlerExceptionResolver 类处理异常

新建类,使用Configuration注解并且实现HandlerExceptionResolver接口,实现方法

spring boot 异常处理 aop springboot抛出异常_异常处理方法_08


AllException类

package com.ht.exception;

import org.springframework.context.annotation.Configuration;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Created by wqx on 2019/3/20.
 */
//第五种方法:使用Configuration注解并且实现HandlerExceptionResolver接口
@Configuration
public class AllException3 implements HandlerExceptionResolver{


    @Nullable
    @Override
    public ModelAndView resolveException(HttpServletRequest req, HttpServletResponse resp, @Nullable Object o, Exception e) {
        ModelAndView mv=new ModelAndView();
        //判断是哪种错误
        if(e instanceof ArithmeticException){
            mv.setViewName("error1");
        }
        if(e instanceof NullPointerException){
            mv.setViewName("error2");
        }
        mv.addObject("error",e.toString());
        return mv;
    }
}

Controller类

spring boot 异常处理 aop springboot抛出异常_java_09


推荐使用第五种方法,既可以将错误定义到一个方法中,又可以传递错误信息到错误页面中