SpringBoot@ExceptionHandler与@ControllerAdvice异常处理详解

2022-10-30 08:55:59
目录
前言自定义error页面@ExceptionHandler注解@ControllerAdvice注解

前言

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

具体处理步骤如下:

自定义error页面

在Spring>

    timestamp 错误发生时间status HTTP状态码error 错误原因exception 异常的类名message 异常消息errors BindingResult异常里的各种错误trace 异常跟踪信息path 错误发生时请求的URL路径

    1: 创建名为com.ch.ch5_3.exception的包 并在该包中创建名为MyException 具体代码如下

    package com.ch.ch5_3.exception;
    public class MyException extends Exception {
    	private static final long serialVersionUID = 1L;
    	public MyException() {
    		super();
    	}
    	public MyException(String message) {
    		super(message);
    	}
    }

    2:创建控制器类TestHandleExceptionController

    创建名为com.ch,ch5_3.controller的包 并在该包中创建名为TestHandleExceptionController的控制器类,在该控制器类中,在4个请求处理方法,一个是导航到index.html 另外三个分别抛出不同的异常 部分代码如下

    package com.ch.ch5_3.controller;
    import java.sql.SQLException;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
        public void db() throws SQLException { 
            throw new SQLException("数据库异常");
        }  
    	@RequestMapping("/my")  
        public void my() throws MyException {  
            throw new MyException("自定义异常");
        }
    	@RequestMapping("/no")  
        public void no() throws Exception {  
            throw new Exception("未知异常");
        } 
    }

    3:View视图页面

    Thymeleaf模板默认将视图页面放在src/main/resources/templates目录下。因此我们在src/main/resources/templates 目录下新建html页面文件,index.html和error.html

    在index.html页面中 有4个超链接请求,3个请求在控制器中有对应处理,另一个请求是404错误

    部分代码如下

    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
    <meta charset="UTF-8">
    <title>index</title>
    <link rel="stylesheet" th:href="@{css/bootstrap.min.css}" rel="external nofollow"  rel="external nofollow"  />
    <!-- 默认访问 src/main/resources/static下的css文件夹-->
    <link rel="stylesheet" th:href="@{css/bootstrap-theme.min.css}" rel="external nofollow"  rel="external nofollow"  />
    				<a th:href="@{db}" rel="external nofollow" >处理数据库异常</a><br>
    				<a th:href="@{my}" rel="external nofollow" >处理自定义异常</a><br>
    				<a th:href="@{no}" rel="external nofollow" >处理未知错误</a>
    				<hr>
    				<a th:href="@{nofound}" rel="external nofollow" >404错误</a>
    			</div>
    		</div>
    	</div>
    </body>
    </html>

    error.html页面部分代码如下

    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
    <meta charset="UTF-8">
    <title>error</title>
    <link rel="stylesheet" th:href="@{css/bootstrap.min.css}" rel="external nofollow"  rel="external nofollow"  />
    <!-- 默认访问 src/main/resources/static下的css文件夹-->
    <link rel="stylesheet" th:href="@{css/bootstrap-theme.min.css}" rel="external nofollow"  rel="external nofollow"  />
    </head>
    <body>
                <div class="common-hint-word">
                    <div th:text="${#dates.format(timestamp,'yyyy-MM-dd HH:mm:ss')}"></div>
                    <div th:text="${message}"></div>
                    <div th:text="${error}"></div>
                </div>
            </div>
        </div>
    </body>
    </html>

    @ExceptionHandler注解

    上面自定义页面并没有处理异常,可以使用@ExceptionHandler注解处理异常,如果有一个由该注解修饰的方法,那么当任何方法抛出异常时都由它来处理

    添加一个注解修饰的方法>

    @ExceptionHandler(value=Excetption.class)
    public String handlerException(Exception e){
    if(e istanceof SQLException){
    return "sql error";
    }
    else if(e instanceof MYException){
    return"myError";
    }
    else{
    return "noerror";
    }
    }

    @ControllerAdvice注解

    使用它注解的类时当前Spring>

    创建GlobalExceptionHandlerController的类 具体代码如下

    package com.ch.ch5_3.controller;
    import java.sql.SQLException;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import com.ch.ch5_3.exception.MyException;
    @ControllerAdvice
    public class GlobalExceptionHandlerController {
    	@ExceptionHandler(value=Exception.class)
    	public String handlerException(Exception e) {
    		//数据库异常
    		if (e instanceof SQLException) {
    			return "sqlError";
    		} else if (e instanceof MyException) {//自定义异常
    			return "myError";
    		} else {//未知异常
    			return "noError";
    		}
    	}
    }

    到此这篇关于SpringBoot @ExceptionHandler与@ControllerAdvice异常处理详解的文章就介绍到这了,更多相关SpringBoot @ExceptionHandler与@ControllerAdvice内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!