springboot全局異常處理方式
一、springboot中處理異常的方式?
1、try…catch處理異常

如果采用這種方式,雖然可以解決,但是存在弊端,需要我們在保存其他業(yè)務數(shù)據(jù)時,也需要在其他方法中加上try…catch進行處理,代碼冗余,不通用。
- 代碼可讀性:業(yè)務邏輯代碼中混入大量的異常處理代碼會降低代碼的可讀性,使得主要業(yè)務邏輯變得難以理解和維護。
- 代碼可維護性:如果在每個可能拋出異常的地方都使用
try...catch,將使得代碼變得冗長和復雜,增加維護成本。 - 異常的傳播:異常的目的是傳遞錯誤信息,如果每個地方都捕獲并處理異常,可能會隱藏錯誤的根本原因,使得問題難以被發(fā)現(xiàn)和解決。
2、全局異常處理器
Spring Boot的全局異常處理是通過@ControllerAdvice或@RestControllerAdvice注解的類來實現(xiàn)的。這些類可以捕獲和處理應用程序中的異常,并返回統(tǒng)一的錯誤響應。
二、為什么需要全局異常處理?
- 統(tǒng)一錯誤響應:**全局異常處理允許你定義一個統(tǒng)一的錯誤響應格式,這樣無論在應用程序的哪個部分發(fā)生異常,都能返回一致的錯誤信息。**這有助于前端開發(fā)者更好地處理錯誤,提升用戶體驗。
- 避免代碼重復:如果沒有全局異常處理,你可能需要在每個控制器或服務中重復編寫異常處理代碼。全局異常處理機制可以集中處理異常,減少代碼重復,提高代碼的可維護性。
- 增強可維護性:集中管理異常處理邏輯使得代碼更加模塊化,易于維護和更新。當需要修改錯誤處理邏輯時,你只需要在一個地方進行修改,而不需要逐個修改每個控制器或服務。
- 提高系統(tǒng)的健壯性:全局異常處理可以捕獲并處理那些在應用程序運行過程中可能未被預期到的異常。這有助于避免應用程序因未處理的異常而崩潰,增強了系統(tǒng)的健壯性。
- 日志記錄和監(jiān)控:全局異常處理通常伴隨著日志記錄,這有助于開發(fā)者在開發(fā)和生產環(huán)境中監(jiān)控和診斷問題。通過記錄詳細的錯誤信息和堆棧跟蹤,可以快速定位問題并進行修復。
- 安全性”通過全局異常處理,可以避免將敏感的系統(tǒng)信息(如內部錯誤代碼或堆棧跟蹤)暴露給用戶。你可以自定義錯誤信息,只向用戶顯示必要的錯誤詳情,從而提高系統(tǒng)的安全性。
- 符合RESTful API設計原則:在RESTful API設計中,使用HTTP狀態(tài)碼來表示不同的錯誤類型是一種常見的做法。全局異常處理可以幫助你根據(jù)異常類型自動設置合適的HTTP狀態(tài)碼,符合RESTful API的設計原則。
- 減少客戶端處理復雜性:當客戶端(如移動應用或前端應用)調用后端服務時,全局異常處理可以確保返回一個清晰、一致的錯誤格式。這使得客戶端開發(fā)者更容易理解和處理這些錯誤,減少客戶端代碼的復雜性。
三、全局異常處理實現(xiàn)
全局異常處理類
package com.example.demo.exception;
import com.example.demo.response.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalException {
@ExceptionHandler(value = {Exception.class})
public Result<String> ex(Exception e)
{
return Result.error(e.getMessage());
}
}controller類
@GetMapping("test")
public int test(){
List<Integer> integers = new ArrayList<>();
for (int i = 0; i < 10; i++){
integers.add(i);
}
//故意數(shù)組過界
for (int i = 0; i < 20; i++){
System.out.println(integers.get(i));
}
return 1;
}result結果類
package com.example.demo.response;
import lombok.Data;
@Data
public class Result<T> {
private int code;
private String msg;
private T data;
public Result() {
}
public Result(int code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public static Result<String> error(String message) {
return new Result(500, message, null);
}
}四、測試
我下面使用到的工具是apifox,當然你也可以直接使用postman或者瀏覽器測試。
啟動springboot項目

使用apifox發(fā)送請求,請求結果如下所示:

這個地方我們就可以發(fā)現(xiàn)實際上就是自動的幫我們做了異常處理了,當然我給的這個實例只是針對于全部的異常而不是自定義的異常。
五、@ControllerAdvice詳解
@ControllerAdvice 是 Spring MVC 提供的一個注解,用于定義一個類作為全局異常處理器。使用這個注解的類可以捕獲和處理來自 Spring MVC 控制器的異常。
以下是 @ControllerAdvice 注解的一些關鍵點:
- 作用域:通常用于處理
@Controller或@RestController中拋出的異常。 - 方法:在類中定義的方法可以使用
@ExceptionHandler注解來指定處理特定類型的異常。 - 返回類型:處理方法通常返回
ModelAndView或ResponseEntity對象,以便控制視圖和響應狀態(tài)。
當然@ControllerAdvice也是可以設置參數(shù)的,可以設置不是作用于全部的controller下,具體實例如下所示:
@RestControllerAdvice(annotations = {RestController.class})
???????@ControllerAdvice(annotations = {RestController.class, Controller.class})六、@ExceptionHandler 詳解
1.用法:
- @ExceptionHandler 注解可以用于方法級別,用于標記一個方法為異常處理方法。
- 異常處理方法需要定義在控制器類中,并且可以有任意的訪問修飾符。
2.參數(shù):
- 異常處理方法的參數(shù)可以是異常類型,也可以是其他類型的參數(shù)。
- 如果異常處理方法的參數(shù)是異常類型,則該方法只會處理指定類型的異常。
- 如果異常處理方法的參數(shù)是其他類型的參數(shù),則該方法會處理所有類型的異常,并且異常對象會作為參數(shù)傳遞給方法。
3.異常處理邏輯:
- 異常處理方法可以編寫任意的異常處理邏輯,比如記錄日志、返回錯誤信息、執(zhí)行特定的補救措施等。
- 在方法中可以通過異常對象來獲取異常信息,如異常消息、堆棧軌跡等。
4.多個異常處理方法:
- 一個控制器類可以有多個異常處理方法,用來處理不同類型的異常。
- 當多個異常處理方法都能處理同一類型的異常時,Spring 框架會選擇最匹配的異常處理方法來處理異常。
到此這篇關于springboot全局異常處理方式的文章就介紹到這了,更多相關springboot全局異常內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java參數(shù)校驗詳解之使用@Valid注解和自定義注解進行參數(shù)驗證
在后端開發(fā)中,參數(shù)校驗是非常普遍的,下面這篇文章主要給大家介紹了關于Java參數(shù)校驗詳解之使用@Valid注解和自定義注解進行參數(shù)驗證的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-06-06
SpringMVC的常見數(shù)據(jù)綁定實戰(zhàn)舉例(以登錄為例演練)
文章以登錄功能為例,詳解SpringMVC的數(shù)據(jù)綁定機制,涵蓋簡單類型、POJO、自定義轉換器(如Date和Signon)、數(shù)組及集合類型等場景,通過Signon類和相關控制器方法演示如何處理不同數(shù)據(jù)類型的綁定與驗證,感興趣的朋友跟隨小編一起看看吧2025-09-09

