springboot 五种异常处理方式

Posted activestruggle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot 五种异常处理方式相关的知识,希望对你有一定的参考价值。

1.自定义错误页面:

  springboot已经内嵌了异常处理的机制,如果发生错误会自动跳转到error界面,默认的error界面为:

  

技术图片

   我们可以自定义异常界面,但是需要在 src/main/resources/templates 目录下创建 error.html 页面

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Title</title>
</head>
<body>
    <!--高版本可以通过${message}获取异常信息-->
    <span th:text="${message}"></span>
</body>
</html>

优点:

  • springboot自带的一场机制,无需自己配置

缺点:

  • 所有的异常信息都在同一个界面

2.在controller类中通过 @ExceptionHandler 注解来新建方法

contorller:

@Controller
public class UsersController {

    @RequestMapping("showInfo")
    public String showIno() {
        String str = null;
        str.length();
        return "OK";
    }

    @RequestMapping("showInfo2")
    public String showIno2() {
        int a = 10 / 0;
        return "OK";
    }

  //value 是一个数组,可以添加多个异常,但只能指向同一个异常页面 @ExceptionHandler(value
= {java.lang.NullPointerException.class}) public ModelAndView nullPointExceptionHandler(Exception e) { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("error", e.toString()); modelAndView.setViewName("error1"); return modelAndView; } @ExceptionHandler(value = {java.lang.ArithmeticException.class}) public ModelAndView ArithmeticExceptionHandler(ArithmeticException e) { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("error", e.toString()); modelAndView.setViewName("error2"); return modelAndView; }

 

error1.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Title</title>
</head>
<body>
    空指针异常
<span th:text="${error}"></span>
</body>
</html>

 

error2:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Title</title>
</head>
<body>
<span th:text="${error}"></span>
</body>
</html>

 

优点:

  • 可以指向多个异常页面

缺点:

  • 只能在一个controller类中起作用,代码重用性低

 

  • 一个异常方法对应一个异常页面,当异常页面过多时会导致异常冗余

 

3.创建一个全局异常类 GlobalException ,通过@ControllerAdvice注解和@ExceptionHandler注解实现全局配置

 

GlobalException:

/*
 * 全局异常处理类
 * */
@ControllerAdvice
public class GlobalException {

    @ExceptionHandler(value = {java.lang.NullPointerException.class})
    public ModelAndView nullPointExceptionHandler(Exception e) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("error", e.toString());
        modelAndView.setViewName("error1");
        return modelAndView;
    }

    @ExceptionHandler(value = {java.lang.ArithmeticException.class})
    public ModelAndView ArithmeticExceptionHandler(ArithmeticException e) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("error", e.toString());
        modelAndView.setViewName("error2");
        return modelAndView;
    }
}

 

 

优点:

  • 可以指向多个异常页面

  • 全局配置,代码重用性高

缺点:

  • 一个异常方法对应一个异常页面,当异常页面过多时会导致异常冗余

4.配置 SimpleMappingExceptionResolver 处理异常

/*
 * 全局异常
 * */

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

import java.util.Properties;

@Configuration
public class GlobalException2 {

    /*
     * 此方法返回值必须是SimpleMappingExceptionResolver类型
     * */
    @Bean
    public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver() {
        SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
        Properties properties = new Properties();
        /*
         *参数一:异常类型,并且是全名
         * 参数二:视图名称
         * */
        properties.put("java.lang.NullPointerException", "error3");
        properties.put("java.lang.ArithmeticException", "error4");

        resolver.setExceptionMappings(properties);
        return resolver;
    }
}

error3.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Title</title>
</head>
<body>
java.lang.NullPointerException
</body>
</html>

优点:

  • 可以指向多个异常页面

  • 全局配置,代码重用性高

  • 一个异常方法对应一个异常页面,当异常页面过多时会导致异常冗余

缺点:

  • 只能做视图和异常的映射,不能做异常信息的传递,将导致异常信息比较模糊

5.自定义 HandlerExceptionResolver 类处理异常

/*
 * 自定义HandlerExceptionResolver对象处理异常
 * 必须实现HandlerExceptionResolver接口
 * */
@Configuration
public class GlobalException3 implements HandlerExceptionResolver {


    /*
     * httpServletRequest产生异常的请求对象
     * httpServletResponse产生异常的响应对象
     * handler此次产生异常的handler对象
     * e 产生异常的异常对象
     * */
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, Exception e) {
        ModelAndView mv = new ModelAndView();
        //判断不同异常类型,做不同视图跳转
        if (e instanceof NullPointerException) {
            mv.setViewName("error5");
        }
        if(e instanceof ArithmeticException){
            mv.setViewName("error6");
        }
        mv.addObject("error",e.toString());
        return mv;
    }
}

 

优点:

  • 可以指向多个异常页面

  • 全局配置,代码重用性高

  • 一个异常方法对应一个异常页面,当异常页面过多时会导致异常冗余

  • 异常信息详细

 

以上是关于springboot 五种异常处理方式的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot学习13:springboot异常处理方式3(使用@ControllerAdvice+@ExceptionHandle注解)

全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段

SpringBoot学习14:springboot异常处理方式4(使用SimpleMappingExceptionResolver处理异常)

12.springboot中常用的异常处理方式

SpringBoot项目如何做到统一异常处理

SpringBoot: 11.异常处理方式1(自定义异常页面)(转)