背景

不管是自己写程序练习还是实际项目开发中,我们总会遇到各种各样的异常情况,比如Java中的NullPointerException,IOException等等;为了处理这些异常,经常需要许多try,catch语句,使程序中出现了很多重复的代码;而SpringBoot就可以通过简单的配置,全局管理异常,极大的简化了异常处理。

引入依赖

这里我们引入web和thymeleaf模块,因为项目中一般出现异常后,都会携带错误信息跳转到Error界面

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

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

编写异常界面

接下来我们在src/resources/templates文件夹下新建一个Error.html用于展示错误信息

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.html.org">
<head>
    <meta charset="UTF-8">
    <title>myErrorPage</title>
</head>
<body>
<h2>异常界面</h2>
<table>
    <tr>
        <td>异常信息:</td>
        <td th:text="${errMsg}"></td>
    </tr>
    <tr>
        <td>时间戳:</td>
        <td th:text="${timestamp}"></td>
    </tr>
    <tr>
        <td>错误码:</td>
        <td th:text="${status}"></td>
    </tr>
    <tr>
        <td>路径:</td>
        <td th:text="${url}"></td>
    </tr>
</table>
</body>
</html>

编写异常配置类

接下来我们新建一个ExceptionConfig.java,用来编写全局异常的控制类。

/**
 * 全局异常配置类
 */
@RestControllerAdvice
public class ExceptionConfig{
    /**
     * 捕获运行时异常,并跳转到自定义的Error界面
     */
    @ExceptionHandler(value = RuntimeException.class)
    public ModelAndView defaultException(HttpServletRequest request,RuntimeException e,HttpServletResponse response){
        Map<String,Object> returnMap = new HashMap<>();
        returnMap.put("errMsg",e.getMessage());
        returnMap.put("timestamp",System.currentTimeMillis());
        returnMap.put("status",response.getStatus());
        returnMap.put("url",request.getRequestURL());

        ModelAndView modelAndView = new ModelAndView("Error",returnMap);
        return modelAndView;
    }

}
  • @RestControllerAdvice:相当于@ControllerAdvice与@ResponseBody的结合体,@ControllerAdvice是用于捕获controller抛出的异常的。
  • @ExceptionHandler:用于标识要捕获的异常类型,这里我们捕获所有运行时异常,实际项目中,我们一般会粒度更细的捕获异常,返回不同的异常信息。

编写控制器

这里为了测试需要,随便制造一个运行时异常。

@RestController
public class ExceptionController{
    /**
     * 测试运行时异常,并跳转异常页面
     */
    @GetMapping(value = "/testRuntimeException")
    public int testDefaultException(){
        String test = "x";
        return Integer.parseInt(test);
    }
}

测试

启动项目,打开浏览器后输入http://localhost:8080/testRuntimeException,就可以看到效果了。

完整的工程代码链接:https://github.com/youzhihua/springboot-training