欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Boot 全局异常处理

程序员文章站 2022-05-22 09:44:21
...

一、ErrorPageRegistrar 异常处理

1.1ErrorPageRegistrar 详解

Spring Boot 为我们提供了统一异常处理方式。通过实现ErrorPageRegistrar 接口来注册异常错误提示页面。
下面是去掉注释后的ErrorPageRegistrar 接口,该接口只有一个registerErrorPages() 方法,通过该方法来注册错误提示页面。

public interface ErrorPageRegistrar {
    void registerErrorPages(ErrorPageRegistry registry);
}

registerErrorPages() 方法中有一个ErrorPageRegistry 类型的参数registry,下面是ErrorPageRegistry 接口的源码。ErrorPageRegistry 接口中提供了一个addErrorPages() 方法,这个方法允许传入多个错误信息页面。

public interface ErrorPageRegistry {
    void addErrorPages(ErrorPage... errorPages);
}

下面是ErrorPage 其中的两个构造函数。
Spring Boot 全局异常处理

到这里我们大概就知道其使用方式了。

1.2ErrorPageRegistrar 实现

错误提示页面。
Spring Boot 全局异常处理

CommonErrorPageRegistrar

@Component
public class CommonErrorPageRegistrar implements ErrorPageRegistrar {
    @Override
    public void registerErrorPages(ErrorPageRegistry registry) {
       // HttpStatus.NOT_FOUND 对应的响应码是404
        ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/static/errorpage/404.html");
        // HttpStatus.INTERNAL_SERVER_ERROR 对应的响应码是500
        ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/static/errorpage/500.html");

        // 根据ErrorPage 的构造函数不仅可以传入Http 对应状态码的枚举,还可以传入对应异常的class 对象
        // ErrorPage nullPointException = new ErrorPage(NullPointerException.class, "/对应的提示页面");

        registry.addErrorPages(errorPage404, errorPage500);
    }
}

控制器ExceptionController

@Controller
public class ExceptionController {
    /**
     * 抛出一个数组下标越界异常,表明是服务端的错误
     */
    @GetMapping("/exception500")
    public void test500(){
        throw new ArrayIndexOutOfBoundsException();
    }
}

PS:我在application.properties 全局配置文件中设置了上下文的访问路径。

server.context-path=/springboot

当在浏览器端访问一个不存在的控制器时,会出现自定义的404 提示页面。
Spring Boot 全局异常处理
当访问“exception500”时,会因为数组下标越界异常提示500 异常页面。
Spring Boot 全局异常处理

二、@ExceptionHandler 异常处理

@ExceptionHandler@ControllerAdvice 支持的全局异常处理本身在Spring MVC 中也是支持的,当然Spring MVC 还提供了其他的方式来处理异常。比如:实现HandlerExceptionResolver 来自定义异常处理器等。基于Spring 与Spring MVC 的Spring Boot 自身也支持这几种异常处理方式。这里只提到基于@ExceptionHandler@ControllerAdvice 注解的异常处理,对于其他的方式,如果你比较感兴趣的话,可以查阅相关资料或者博文,这里就不再一一列出了。

错误提示页面。
Spring Boot 全局异常处理

全局配置文件application.properties

#设置上下文访问路径
server.context-path=/springboot
#设置jsp 访问资源前缀
spring.mvc.view.prefix=/WEB-INF/views/
#设置jsp 访问资源后缀
spring.mvc.view.suffix=.jsp

全局异常处理MyExceptionHandler

@ControllerAdvice
public class MyExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ModelAndView error(Exception e){
        ModelAndView modelAndView = new ModelAndView();

        // 封装异常信息,用于页面的渲染
        modelAndView.addObject("exception", e.getClass().getName());
        // 转发到error.jsp 页面,进行错误提示
        modelAndView.setViewName("/error");

        return modelAndView;
    }

}

异常信息提示页面error.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>error</title>
</head>
<body>
    <h1>出故障啦! </h1>
    <!-- 获取异常信息-->
    <h1>原因是: ${exception} </h1>
</body>
</html>

当访问“exception500”时,异常页面显示如下:
Spring Boot 全局异常处理