SpringBoot @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 具體代碼如下

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 Boot應用中所有類的統一異常處理類,該類中使用@ExceptionHandler註解的方法統一處理異常,不需要在每個Controller中逐一定義異常處理方法,這是因為對所有註解瞭@ControllerAdvice註解進行全局異常處理

創建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內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: