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

如果采用這種方式,雖然可以解決,但是存在弊端,需要我們在保存其他業(yè)務(wù)數(shù)據(jù)時(shí),也需要在其他方法中加上try…catch進(jìn)行處理,代碼冗余,不通用。
- 代碼可讀性:業(yè)務(wù)邏輯代碼中混入大量的異常處理代碼會(huì)降低代碼的可讀性,使得主要業(yè)務(wù)邏輯變得難以理解和維護(hù)。
- 代碼可維護(hù)性:如果在每個(gè)可能拋出異常的地方都使用
try...catch,將使得代碼變得冗長和復(fù)雜,增加維護(hù)成本。 - 異常的傳播:異常的目的是傳遞錯(cuò)誤信息,如果每個(gè)地方都捕獲并處理異常,可能會(huì)隱藏錯(cuò)誤的根本原因,使得問題難以被發(fā)現(xiàn)和解決。
2、全局異常處理器
Spring Boot的全局異常處理是通過@ControllerAdvice或@RestControllerAdvice注解的類來實(shí)現(xiàn)的。這些類可以捕獲和處理應(yīng)用程序中的異常,并返回統(tǒng)一的錯(cuò)誤響應(yīng)。
二、為什么需要全局異常處理?
- 統(tǒng)一錯(cuò)誤響應(yīng):**全局異常處理允許你定義一個(gè)統(tǒng)一的錯(cuò)誤響應(yīng)格式,這樣無論在應(yīng)用程序的哪個(gè)部分發(fā)生異常,都能返回一致的錯(cuò)誤信息。**這有助于前端開發(fā)者更好地處理錯(cuò)誤,提升用戶體驗(yàn)。
- 避免代碼重復(fù):如果沒有全局異常處理,你可能需要在每個(gè)控制器或服務(wù)中重復(fù)編寫異常處理代碼。全局異常處理機(jī)制可以集中處理異常,減少代碼重復(fù),提高代碼的可維護(hù)性。
- 增強(qiáng)可維護(hù)性:集中管理異常處理邏輯使得代碼更加模塊化,易于維護(hù)和更新。當(dāng)需要修改錯(cuò)誤處理邏輯時(shí),你只需要在一個(gè)地方進(jìn)行修改,而不需要逐個(gè)修改每個(gè)控制器或服務(wù)。
- 提高系統(tǒng)的健壯性:全局異常處理可以捕獲并處理那些在應(yīng)用程序運(yùn)行過程中可能未被預(yù)期到的異常。這有助于避免應(yīng)用程序因未處理的異常而崩潰,增強(qiáng)了系統(tǒng)的健壯性。
- 日志記錄和監(jiān)控:全局異常處理通常伴隨著日志記錄,這有助于開發(fā)者在開發(fā)和生產(chǎn)環(huán)境中監(jiān)控和診斷問題。通過記錄詳細(xì)的錯(cuò)誤信息和堆棧跟蹤,可以快速定位問題并進(jìn)行修復(fù)。
- 安全性”通過全局異常處理,可以避免將敏感的系統(tǒng)信息(如內(nèi)部錯(cuò)誤代碼或堆棧跟蹤)暴露給用戶。你可以自定義錯(cuò)誤信息,只向用戶顯示必要的錯(cuò)誤詳情,從而提高系統(tǒng)的安全性。
- 符合RESTful API設(shè)計(jì)原則:在RESTful API設(shè)計(jì)中,使用HTTP狀態(tài)碼來表示不同的錯(cuò)誤類型是一種常見的做法。全局異常處理可以幫助你根據(jù)異常類型自動(dòng)設(shè)置合適的HTTP狀態(tài)碼,符合RESTful API的設(shè)計(jì)原則。
- 減少客戶端處理復(fù)雜性:當(dāng)客戶端(如移動(dòng)應(yīng)用或前端應(yīng)用)調(diào)用后端服務(wù)時(shí),全局異常處理可以確保返回一個(gè)清晰、一致的錯(cuò)誤格式。這使得客戶端開發(fā)者更容易理解和處理這些錯(cuò)誤,減少客戶端代碼的復(fù)雜性。
三、全局異常處理實(shí)現(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結(jié)果類
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,當(dāng)然你也可以直接使用postman或者瀏覽器測試。
啟動(dòng)springboot項(xiàng)目

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

這個(gè)地方我們就可以發(fā)現(xiàn)實(shí)際上就是自動(dòng)的幫我們做了異常處理了,當(dāng)然我給的這個(gè)實(shí)例只是針對于全部的異常而不是自定義的異常。
五、@ControllerAdvice詳解
@ControllerAdvice 是 Spring MVC 提供的一個(gè)注解,用于定義一個(gè)類作為全局異常處理器。使用這個(gè)注解的類可以捕獲和處理來自 Spring MVC 控制器的異常。
以下是 @ControllerAdvice 注解的一些關(guān)鍵點(diǎn):
- 作用域:通常用于處理
@Controller或@RestController中拋出的異常。 - 方法:在類中定義的方法可以使用
@ExceptionHandler注解來指定處理特定類型的異常。 - 返回類型:處理方法通常返回
ModelAndView或ResponseEntity對象,以便控制視圖和響應(yīng)狀態(tài)。
當(dāng)然@ControllerAdvice也是可以設(shè)置參數(shù)的,可以設(shè)置不是作用于全部的controller下,具體實(shí)例如下所示:
@RestControllerAdvice(annotations = {RestController.class})
???????@ControllerAdvice(annotations = {RestController.class, Controller.class})六、@ExceptionHandler 詳解
1.用法:
- @ExceptionHandler 注解可以用于方法級別,用于標(biāo)記一個(gè)方法為異常處理方法。
- 異常處理方法需要定義在控制器類中,并且可以有任意的訪問修飾符。
2.參數(shù):
- 異常處理方法的參數(shù)可以是異常類型,也可以是其他類型的參數(shù)。
- 如果異常處理方法的參數(shù)是異常類型,則該方法只會(huì)處理指定類型的異常。
- 如果異常處理方法的參數(shù)是其他類型的參數(shù),則該方法會(huì)處理所有類型的異常,并且異常對象會(huì)作為參數(shù)傳遞給方法。
3.異常處理邏輯:
- 異常處理方法可以編寫任意的異常處理邏輯,比如記錄日志、返回錯(cuò)誤信息、執(zhí)行特定的補(bǔ)救措施等。
- 在方法中可以通過異常對象來獲取異常信息,如異常消息、堆棧軌跡等。
4.多個(gè)異常處理方法:
- 一個(gè)控制器類可以有多個(gè)異常處理方法,用來處理不同類型的異常。
- 當(dāng)多個(gè)異常處理方法都能處理同一類型的異常時(shí),Spring 框架會(huì)選擇最匹配的異常處理方法來處理異常。
到此這篇關(guān)于springboot全局異常處理方式的文章就介紹到這了,更多相關(guān)springboot全局異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決spring cloud zuul與nginx的域名轉(zhuǎn)發(fā)問題
這篇文章主要介紹了spring cloud zuul與nginx的域名轉(zhuǎn)發(fā)問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
SpringMVC?RESTFul實(shí)戰(zhàn)案例刪除功能實(shí)現(xiàn)
這篇文章主要為大家介紹了SpringMVC?RESTFul實(shí)戰(zhàn)案例刪除功能實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
CentOS?7.9服務(wù)器Java部署環(huán)境配置的過程詳解
這篇文章主要介紹了CentOS?7.9服務(wù)器Java部署環(huán)境配置,主要包括ftp服務(wù)器搭建過程、jdk安裝方法以及mysql安裝過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07

