Spring Boot 全局异常处理

落日映苍穹つ 2022-05-31 08:41 444阅读 0赞

一、ErrorPageRegistrar 异常处理

1.1ErrorPageRegistrar 详解

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

  1. public interface ErrorPageRegistrar {
  2. void registerErrorPages(ErrorPageRegistry registry);
  3. }

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

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

下面是ErrorPage 其中的两个构造函数。
这里写图片描述

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

1.2ErrorPageRegistrar 实现

错误提示页面。
这里写图片描述

CommonErrorPageRegistrar

  1. @Component
  2. public class CommonErrorPageRegistrar implements ErrorPageRegistrar {
  3. @Override
  4. public void registerErrorPages(ErrorPageRegistry registry) {
  5. // HttpStatus.NOT_FOUND 对应的响应码是404
  6. ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/static/errorpage/404.html");
  7. // HttpStatus.INTERNAL_SERVER_ERROR 对应的响应码是500
  8. ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/static/errorpage/500.html");
  9. // 根据ErrorPage 的构造函数不仅可以传入Http 对应状态码的枚举,还可以传入对应异常的class 对象
  10. // ErrorPage nullPointException = new ErrorPage(NullPointerException.class, "/对应的提示页面");
  11. registry.addErrorPages(errorPage404, errorPage500);
  12. }
  13. }

控制器ExceptionController

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

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

  1. server.context-path=/springboot

当在浏览器端访问一个不存在的控制器时,会出现自定义的404 提示页面。
这里写图片描述
当访问“exception500”时,会因为数组下标越界异常提示500 异常页面。
这里写图片描述

二、@ExceptionHandler 异常处理

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

错误提示页面。
这里写图片描述

全局配置文件application.properties

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

全局异常处理MyExceptionHandler

  1. @ControllerAdvice
  2. public class MyExceptionHandler {
  3. @ExceptionHandler(Exception.class)
  4. public ModelAndView error(Exception e){
  5. ModelAndView modelAndView = new ModelAndView();
  6. // 封装异常信息,用于页面的渲染
  7. modelAndView.addObject("exception", e.getClass().getName());
  8. // 转发到error.jsp 页面,进行错误提示
  9. modelAndView.setViewName("/error");
  10. return modelAndView;
  11. }
  12. }

异常信息提示页面error.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>error</title>
  6. </head>
  7. <body>
  8. <h1>出故障啦! </h1>
  9. <!-- 获取异常信息-->
  10. <h1>原因是: ${exception} </h1>
  11. </body>
  12. </html>

当访问“exception500”时,异常页面显示如下:
这里写图片描述

发表评论

表情:
评论列表 (有 0 条评论,444人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Spring Boot全局异常处理

    在开发Web应用程序时,异常处理是非常重要的。在Spring Boot中,我们可以使用全局异常处理器来捕获并处理应用程序中的异常。本文将介绍如何使用Spring Boot的全局