[JAVA] SpringBoot @ExceptionHandler与@ControllerAdvice异常处理详解

1856 0
黑夜隐士 2022-11-8 17:40:25 | 显示全部楼层 |阅读模式
目录

    前言自定义error页面@ExceptionHandler注解@ControllerAdvice注解


前言

如果能将所有类型的异常处理从各层中解耦出来,则既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。幸运的是,Spring框架支持这样的实现。接下来将从自定义error页面。@ExceptionHandler注解以及@ControllerAdvice3种方式讲解Spring Boot应用的异常统一处理
具体处理步骤如下:

自定义error页面

在Spring Boot Web应用的src/main/resources/templates 目录下添加error.html页面 访问发生错误或异常时,Spring Boot将自动找到该页面作为错误页面。Spring Boot为错误页面提供了以下属性
    timestamp 错误发生时间status HTTP状态码error 错误原因exception 异常的类名message 异常消息errors BindingResult异常里的各种错误trace 异常跟踪信息path 错误发生时请求的URL路径
1: 创建名为com.ch.ch5_3.exception的包 并在该包中创建名为MyException 具体代码如下
  1. package com.ch.ch5_3.exception;
  2. public class MyException extends Exception {
  3.         private static final long serialVersionUID = 1L;
  4.         public MyException() {
  5.                 super();
  6.         }
  7.         public MyException(String message) {
  8.                 super(message);
  9.         }
  10. }
复制代码
2:创建控制器类TestHandleExceptionController
创建名为com.ch,ch5_3.controller的包 并在该包中创建名为TestHandleExceptionController的控制器类,在该控制器类中,在4个请求处理方法,一个是导航到index.html 另外三个分别抛出不同的异常 部分代码如下
  1. package com.ch.ch5_3.controller;
  2. import java.sql.SQLException;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5.     public void db() throws SQLException {
  6.         throw new SQLException("数据库异常");
  7.     }  
  8.         @RequestMapping("/my")  
  9.     public void my() throws MyException {  
  10.         throw new MyException("自定义异常");
  11.     }
  12.         @RequestMapping("/no")  
  13.     public void no() throws Exception {  
  14.         throw new Exception("未知异常");
  15.     }
  16. }
复制代码
3:View视图页面
Thymeleaf模板默认将视图页面放在src/main/resources/templates目录下。因此我们在src/main/resources/templates 目录下新建html页面文件,index.html和error.html
在index.html页面中 有4个超链接请求,3个请求在控制器中有对应处理,另一个请求是404错误
部分代码如下

  1. <!DOCTYPE html>
  2. <html xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>index</title>
  6. <link rel="stylesheet" th:href="@{css/bootstrap.min.css}" rel="external nofollow"  rel="external nofollow"  />
  7. <!-- 默认访问 src/main/resources/static下的css文件夹-->
  8. <link rel="stylesheet" th:href="@{css/bootstrap-theme.min.css}" rel="external nofollow"  rel="external nofollow"  />
  9.                                 <a th:href="@{db}" rel="external nofollow" >处理数据库异常</a><br>
  10.                                 <a th:href="@{my}" rel="external nofollow" >处理自定义异常</a><br>
  11.                                 <a th:href="@{no}" rel="external nofollow" >处理未知错误</a>
  12.                                 <hr>
  13.                                 <a th:href="@{nofound}" rel="external nofollow" >404错误</a>
  14.                         </div>
  15.                 </div>
  16.         </div>
  17. </body>
  18. </html>
复制代码
error.html页面部分代码如下

  1. <!DOCTYPE html>
  2. <html xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>error</title>
  6. <link rel="stylesheet" th:href="@{css/bootstrap.min.css}" rel="external nofollow"  rel="external nofollow"  />
  7. <!-- 默认访问 src/main/resources/static下的css文件夹-->
  8. <link rel="stylesheet" th:href="@{css/bootstrap-theme.min.css}" rel="external nofollow"  rel="external nofollow"  />
  9. </head>
  10. <body>
  11.             <div class="common-hint-word">
  12.                 <div th:text="${#dates.format(timestamp,'yyyy-MM-dd HH:mm:ss')}"></div>
  13.                 <div th:text="${message}"></div>
  14.                 <div th:text="${error}"></div>
  15.             </div>
  16.         </div>
  17.     </div>
  18. </body>
  19. </html>
复制代码
@ExceptionHandler注解

上面自定义页面并没有处理异常,可以使用@ExceptionHandler注解处理异常,如果有一个由该注解修饰的方法,那么当任何方法抛出异常时都由它来处理
添加一个注解修饰的方法 具体代码如下
  1. @ExceptionHandler(value=Excetption.class)
  2. public String handlerException(Exception e){
  3. if(e istanceof SQLException){
  4. return "sql error";
  5. }
  6. else if(e instanceof MYException){
  7. return"myError";
  8. }
  9. else{
  10. return "noerror";
  11. }
  12. }
复制代码
@ControllerAdvice注解

使用它注解的类时当前Spring Boot应用中所有类的统一异常处理类,该类中使用@ExceptionHandler注解的方法统一处理异常,不需要在每个Controller中逐一定义异常处理方法,这是因为对所有注解了@ControllerAdvice注解进行全局异常处理
创建GlobalExceptionHandlerController的类 具体代码如下
  1. package com.ch.ch5_3.controller;
  2. import java.sql.SQLException;
  3. import org.springframework.web.bind.annotation.ControllerAdvice;
  4. import org.springframework.web.bind.annotation.ExceptionHandler;
  5. import com.ch.ch5_3.exception.MyException;
  6. @ControllerAdvice
  7. public class GlobalExceptionHandlerController {
  8.         @ExceptionHandler(value=Exception.class)
  9.         public String handlerException(Exception e) {
  10.                 //数据库异常
  11.                 if (e instanceof SQLException) {
  12.                         return "sqlError";
  13.                 } else if (e instanceof MyException) {//自定义异常
  14.                         return "myError";
  15.                 } else {//未知异常
  16.                         return "noError";
  17.                 }
  18.         }
  19. }
复制代码
到此这篇关于SpringBoot @ExceptionHandler与@ControllerAdvice异常处理详解的文章就介绍到这了,更多相关SpringBoot @ExceptionHandler与@ControllerAdvice内容请搜索中国红客联盟以前的文章或继续浏览下面的相关文章希望大家以后多多支持中国红客联盟!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行