SpringBoot对异常处理的常用方式

1.测试环境搭建(springboot工程)

pom文件关键依赖

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- thymeleaf模板 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

application.yml文件

spring:
  application:
    name: springboot-exhandler-demo
  # thymeleaf模板引擎配置
  thymeleaf:
    mode: HTML5
    prefix: classpath:/templates/html/
    suffix: .html
    cache: false
    encoding: UTF-8
    enabled: true
server:
  port: 8080

启动类

@SpringBootApplication
public class SpringbootExhandlerDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootExhandlerDemoApplication.class, args);
    }

}

错误提示页面:err_page.html(文件放在resources/templates/html/目录下)

<!DOCTYPE html>
<html lang="zh" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" >
<head>
    <meta charset="UTF-8">
    <title>错误提示页面</title>
</head>
<body>
    <h1>出错了,请与管理员联系!</h1>
    出错信息: <span th:text="${error} ?: '可能没有传递异常信息,获取出错信息失败!' " th:value="获取详细信息失败"></span>
</body>
</html>

2.异常处理

2.1 利用@ExceptionHandle注解处理

直接在控制器类中使用@ExceptionHandler注解。

目录结构:

avatar

TestController

@Controller
public class TestController {
    /** 
     * 该控制器不具备实际的跳转首页index功能,目的仅仅产生ArithmeticException异常.
     * @return java.lang.String
     */
    @RequestMapping("/index")
    public String toIndex(){
        // 创造ArithmeticException异常
        int a = 10 / 0;
        return "index";
    }

    /** 
     * 处理ArithmeticException异常,在err_page页面显示异常详细信息.
     * @param ex 异常对象,即捕获到的ArithmeticException对象;该对象会被疯转到ModelAndView中
     * @return org.springframework.web.servlet.ModelAndView
     */
    @ExceptionHandler(value = {ArithmeticException.class})
    public ModelAndView rithmeticExceptionHandler(Exception ex){
        ModelAndView mv = new ModelAndView();
        mv.addObject("error", ex.toString());
        mv.setViewName("err_page");
        return mv;
    }

}

2.2 利用@ControllerAdvice配合@ExceptionHandler注解处理

新建增强的控制器类处理异常。

目录结构:

avatar

TestController

@Controller
public class TestController {
    /** 
     * 该控制器不具备实际的跳转首页index功能,目的仅仅产生ArithmeticException异常.
     * @return java.lang.String
     */
    @RequestMapping("/index")
    public String toIndex(){
        // 创造ArithmeticException异常
        int a = 10 / 0;
        return "index";
    }
}

GlobalExceptionHandler

@ControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 处理ArithmeticException异常,在err_page页面显示异常详细信息.
     * @param ex 异常对象,即捕获到的ArithmeticException对象;该对象会被疯转到ModelAndView中
     * @return org.springframework.web.servlet.ModelAndView
     */
    @ExceptionHandler(value = {ArithmeticException.class})
    public ModelAndView rithmeticExceptionHandler(Exception ex){
        ModelAndView mv = new ModelAndView();
        mv.addObject("error", ex.toString());
        mv.setViewName("err_page");
        return mv;
    }
    
}

2.3 利用SimpleMappingExceptionResolver处理

通过创建SimpleMappingExceptionResolver实例,通过配置类GlobalExceptionConfig注入到Spring容器中

目录结构:

avatar

TestController

@Controller
public class TestController {
    /** 
     * 该控制器不具备实际的跳转首页index功能,目的仅仅产生ArithmeticException异常.
     * @return java.lang.String
     */
    @RequestMapping("/index")
    public String toIndex(){
        // 创造ArithmeticException异常
        int a = 10 / 0;
        return "index";
    }
}

GlobalExceptionConfig

/**
 * 通过SimpleMappingExceptionResolver做全局异常处理,跳转的页面一般是知道该异常信息的指定描述页面.
 */
@Configuration
public class GlobalExceptionConfig {

    @Bean
    public SimpleMappingExceptionResolver simpleMappingExceptionResolver(){
        SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
        Properties mappings = new Properties();
        //添加异常与视图映射;mappings的key是异常全限定名,value是视图名称;mappings可以添加多个映射关系
        mappings.put("java.lang.ArithmeticException", "err_page");
        //mappings.put("java.lang.NullPointerException","空指针异常视图名");
        resolver.setExceptionMappings(mappings);
        return resolver;
    }
    
}

2.4 利用HandlerExceptionResolver处理

创建springboot配置类GlobalExceptionConfig,该类实现HandlerExceptionResolver接口,重写resolveException()方法

目录结构:

avatar

GlobalExceptionConfig

/**
 * 通过实现了HandlerExceptionResolver接口的配置类做全局异常处理.
 */
@Configuration
public class GlobalExceptionConfig implements HandlerExceptionResolver {

    /**
     * description:.
     * @param request request对象
     * @param response response对象
     * @param handler 这里指的是发生异常的控制器
     * @param ex 异常信息
     * @return org.springframework.web.servlet.ModelAndView
     */
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        ModelAndView mv = new ModelAndView();
        //异常判断和视图处理
        if (ex instanceof ArithmeticException){
            mv.addObject("error", ex.toString());
            mv.setViewName("err_page");
        }
        if (ex instanceof NullPointerException){
            mv.addObject("error", ex.toString());
            mv.setViewName("err_null");
        }
        // ...
        return mv;
    }
}

注:Demo中只使用了一个错误页面;实际中错误页面根据自己实际情况而定,不同的错误页面可以自己定制,没必要跳转到同一个页面

posted @ 2020-07-30 15:53  youngyajun  阅读(371)  评论(0编辑  收藏  举报