Spring Boot 異常處理:從全局捕獲到優化用戶體驗!

全文目錄:

    • 開篇語
    • **前言**
    • **1. Spring Boot 異常處理的基本概念**
    • **2. 使用 `@ExceptionHandler` 局部處理異常**
      • **示例:局部異常處理**
      • **優化建議:**
    • **3. 使用 `@ControllerAdvice` 和 `@RestControllerAdvice` 進行全局異常處理**
      • **示例:全局異常處理**
      • **優化建議:**
    • **4. 自定義異常和異常處理**
      • **示例:自定義異常類**
      • **優化建議:**
    • **5. 優化用戶體驗:自定義錯誤響應**
      • **示例:自定義錯誤響應類**
      • **示例:在異常處理中使用自定義錯誤響應**
      • **優化建議:**
    • **6. 使用 `@ResponseStatus` 定義 HTTP 狀態碼**
      • **示例:使用 `@ResponseStatus` 注解**
    • **7. 結論**
    • 文末

開篇語

哈嘍,各位小伙伴們,你們好呀,我是喵手。運營社區:C站/掘金/騰訊云/阿里云/華為云/51CTO;歡迎大家常來逛逛

??今天我要給大家分享一些自己日常學習到的一些知識點,并以文字的形式跟大家一起交流,互相學習,一個人雖可以走的更快,但一群人可以走的更遠。

??我是一名后端開發愛好者,工作日常接觸到最多的就是Java語言啦,所以我都盡量抽業余時間把自己所學到所會的,通過文章的形式進行輸出,希望以這種方式幫助到更多的初學者或者想入門的小伙伴們,同時也能對自己的技術進行沉淀,加以復盤,查缺補漏。

小伙伴們在批閱的過程中,如果覺得文章不錯,歡迎點贊、收藏、關注哦。三連即是對作者我寫作道路上最好的鼓勵與支持!

前言

??在開發過程中,異常是不可避免的,尤其是當應用規模越來越大時,異常的管理和處理變得尤為重要。在 Spring Boot 應用中,良好的異常處理不僅能幫助開發者快速定位和修復問題,還能有效優化用戶體驗。通過對異常的全局捕獲和處理,能夠使得系統更加健壯,并且為用戶提供清晰的錯誤信息和友好的反饋。

??本文將介紹如何在 Spring Boot 中進行異常處理,涵蓋從全局異常捕獲到優化用戶體驗的常用實踐。

1. Spring Boot 異常處理的基本概念

在 Spring Boot 中,異常處理主要有以下幾種常見方式:

  • 局部異常處理:在控制器(Controller)方法內部處理特定的異常。
  • 全局異常處理:使用 @ControllerAdvice@RestControllerAdvice 注解進行全局異常捕獲。
  • 自定義異常:通過創建自定義異常類和異常處理類來處理特定場景的異常。

2. 使用 @ExceptionHandler 局部處理異常

在 Spring Boot 中,你可以在單個控制器類中使用 @ExceptionHandler 注解來捕獲和處理異常。這種方式適用于只需要在特定控制器中處理的異常。

示例:局部異常處理

@RestController
public class MyController {@GetMapping("/divide")public int divide(@RequestParam int a, @RequestParam int b) {return a / b;}@ExceptionHandler(ArithmeticException.class)public ResponseEntity<String> handleArithmeticException(ArithmeticException ex) {return new ResponseEntity<>("Error: " + ex.getMessage(), HttpStatus.BAD_REQUEST);}
}

在上面的示例中,當 /divide 路由處理過程中發生 ArithmeticException 異常時,handleArithmeticException 方法將會捕獲這個異常并返回一個自定義的錯誤信息。

優化建議:

局部異常處理適用于單個控制器類,但當異常處理邏輯需要應用于多個控制器時,這種方式就顯得不夠靈活。因此,推薦使用全局異常處理來統一處理應用中的異常。

3. 使用 @ControllerAdvice@RestControllerAdvice 進行全局異常處理

為了簡化全局異常處理,Spring 提供了 @ControllerAdvice@RestControllerAdvice 注解,用于定義全局異常處理類。@RestControllerAdvice@ControllerAdvice@ResponseBody 的結合,適用于處理 RESTful 風格的應用。

示例:全局異常處理

首先創建一個全局異常處理類,使用 @ControllerAdvice 注解:

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(ArithmeticException.class)public ResponseEntity<String> handleArithmeticException(ArithmeticException ex) {return new ResponseEntity<>("Global Error: " + ex.getMessage(), HttpStatus.BAD_REQUEST);}@ExceptionHandler(Exception.class)public ResponseEntity<String> handleGenericException(Exception ex) {return new ResponseEntity<>("Unexpected Error: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);}
}

在這個例子中,GlobalExceptionHandler 捕獲了全局范圍內的 ArithmeticExceptionException,并返回自定義的錯誤信息。@ControllerAdvice 可以捕獲所有控制器中的異常,因此異常處理邏輯可以集中管理。

優化建議:

全局異常處理的優勢是可以統一管理和處理應用中的異常,特別是在開發大型應用時,能夠減少代碼重復。你可以在此類中捕獲各種類型的異常,并進行適當的錯誤響應。

4. 自定義異常和異常處理

在一些情況下,你可能需要為應用創建自定義異常類,以便針對特定的業務場景進行處理。自定義異常類通常繼承 RuntimeExceptionException

示例:自定義異常類

public class ResourceNotFoundException extends RuntimeException {public ResourceNotFoundException(String message) {super(message);}
}

然后,在全局異常處理類中捕獲這個自定義異常:

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(ResourceNotFoundException.class)public ResponseEntity<String> handleResourceNotFoundException(ResourceNotFoundException ex) {return new ResponseEntity<>("Resource Not Found: " + ex.getMessage(), HttpStatus.NOT_FOUND);}
}

優化建議:

使用自定義異常能夠明確區分不同類型的錯誤,并且可以通過返回不同的 HTTP 狀態碼(如 404、500 等)提供給用戶更明確的信息。

5. 優化用戶體驗:自定義錯誤響應

當異常發生時,簡單的錯誤消息往往不能提供足夠的信息。為了改善用戶體驗,可以通過返回詳細的錯誤響應體來幫助前端或用戶更好地理解錯誤情況。

示例:自定義錯誤響應類

public class ErrorResponse {private String message;private int status;private long timestamp;public ErrorResponse(String message, int status) {this.message = message;this.status = status;this.timestamp = System.currentTimeMillis();}// Getters and setters
}

示例:在異常處理中使用自定義錯誤響應

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(ResourceNotFoundException.class)public ResponseEntity<ErrorResponse> handleResourceNotFoundException(ResourceNotFoundException ex) {ErrorResponse errorResponse = new ErrorResponse(ex.getMessage(), HttpStatus.NOT_FOUND.value());return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);}
}

優化建議:

通過自定義錯誤響應類,可以將更多信息傳遞給前端。例如,錯誤消息、狀態碼和時間戳等信息,這些都有助于前端開發人員調試和處理異常。確保錯誤信息清晰且易于理解,以改善用戶體驗。

6. 使用 @ResponseStatus 定義 HTTP 狀態碼

@ResponseStatus 注解可以直接在異常類上指定 HTTP 狀態碼。這樣,當該異常被拋出時,Spring 會自動返回指定的狀態碼。

示例:使用 @ResponseStatus 注解

@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Resource Not Found")
public class ResourceNotFoundException extends RuntimeException {public ResourceNotFoundException(String message) {super(message);}
}

這樣,當 ResourceNotFoundException 被拋出時,Spring 會自動返回 HTTP 狀態碼 404,并帶有自定義的錯誤信息。

7. 結論

Spring Boot 的異常處理機制非常強大,通過合理使用全局異常處理、局部異常處理、自定義異常類以及自定義錯誤響應,可以大大提升系統的健壯性和用戶體驗。

  1. 局部異常處理:適用于只需要在某個控制器內處理的異常,使用 @ExceptionHandler 注解。
  2. 全局異常處理:使用 @ControllerAdvice@RestControllerAdvice 進行全局異常捕獲,便于集中管理異常處理。
  3. 自定義異常:通過自定義異常類和自定義異常處理邏輯,使得異常處理更加符合業務需求。
  4. 優化用戶體驗:通過返回詳細的錯誤響應,幫助用戶理解問題所在,同時提供更好的錯誤信息。

通過這些優化,你的 Spring Boot 應用將能更好地處理異常,并提升用戶體驗。

… …

文末

好啦,以上就是我這期的全部內容,如果有任何疑問,歡迎下方留言哦,咱們下期見。

… …

學習不分先后,知識不分多少;事無巨細,當以虛心求教;三人行,必有我師焉!!!

wished for you successed !!!


??若喜歡我,就請關注我叭。

??若對您有用,就請點贊叭。
??若有疑問,就請評論留言告訴我叭。


版權聲明:本文由作者原創,轉載請注明出處,謝謝支持!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91574.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91574.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91574.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue3.0 + TypeScript 中使用 axios 同時進行二次封裝

項目背景是vite搭建的vue3.0 TypeScript 的項目&#xff0c;需要統一處理和統一維護就對axios進行了二次封裝 axios的安裝 npm install axios定義http文件夾然后內部定義index.ts文件&#xff0c;內部開始封裝 import axios, {type AxiosInstance} from "axios";…

ESP32- 項目應用1 音樂播放器之sd的驅動配置 #1

音樂播放器 ESP32- 項目應用1 音樂播放器之sd的驅動配置 #1 文章目錄 音樂播放器 1 sd卡介紹 1.1 SDCARD介紹 1.2 物理結構 1.3 協議說明 1.4 sd 卡模式 1.5 數據模式 1.6 sdio 初始化流程 1.7 SPI 模式下的 SD 卡初始化 2 原理圖 2.1 sd原理圖 2.2 esp32的接口 3 代碼配置 3.…

Vue.js 指令系統完全指南:深入理解 v- 指令

Vue.js 的指令系統是其最強大的特性之一&#xff0c;通過以 v- 開頭的特殊屬性&#xff0c;我們可以在模板中聲明式地綁定底層Vue實例的數據。本文將深入講解Vue中最重要的指令&#xff0c;幫助掌握Vue的核心功能。 文章目錄1. v-model&#xff1a;雙向數據綁定的核心基本用法修…

計算機分類匯總大全

前端部分有 Node.js、ActionScript、Swift、TypeScript、Webpack、JavaScript。需要分別詳細說明它們的定義、特點、應用場景、優缺點等。比如 Node.js&#xff0c;要提到它的運行環境、事件驅動、非阻塞 I/O&#xff0c;適合的應用如 API 服務、實時應用&#xff0c;以及常用框…

模擬鏈路濾波器設計一些細節

目錄 原設計思路剖析 300M帶寬仿真與計算 原設計思路剖析 濾波器設計的一些細節,以下為ADS54J60模擬鏈路的一些問題設計原理圖 實際電路設計如上所示,但是實際bom并未按此設計,根據實際的BOM明細以及ADC使用說明書,可以間接理解原設計者的設計初衷,是將ADC的一部分特性…

CatBoost 完整解析:類別特征友好的梯度提升框架

1?? 什么是 CatBoost&#xff1f;CatBoost&#xff08;Categorial Boosting&#xff09;是由 Yandex&#xff08;俄羅斯搜索引擎公司&#xff09;開源的梯度提升框架&#xff0c;專為類別特征處理優化。核心特點&#xff1a;無需手動 one-hot / LabelEncoding&#xff0c;原生…

NDBmysql-cluster集群部署腳本

NDB(Network Database)是MySQL Cluster的核心存儲引擎,專為高可用性、高吞吐量、分布式數據存儲設計,采用內存計算+磁盤持久化架構,支持跨節點數據分片與自動冗余,適用于對實時性和可靠性要求嚴苛的業務場景(如金融交易、電信計費、實時分析等)。 今天大白鼠就分享構建…

計算機網絡中的socket是什么?編程語言中的socket編程又是什么?python的socket編程又該如何用?

1. 計算機網絡中的 Socket 是什么&#xff1f; 想象一下電話系統&#xff1a; 電話插座 (Socket)&#xff1a; 是墻上的一個物理接口&#xff0c;它本身不是通話&#xff0c;但它是建立通話連接的端點。你需要把電話線插進插座才能打電話。通話 (Connection)&#xff1a; 是兩臺…

【科普】進程與線程的區別

一、定義與概念&#xff1a;進程&#xff1a;進程是執行中的一段程序。一旦程序被載入到內存中并準備執行&#xff0c;就變成了一個進程。進程是表示資源分配的基本概念&#xff0c;又是調度運行的基本單位&#xff0c;是系統中的并發執行的單位。線程&#xff1a;線程是進程中…

Conda創建虛擬環境,解決不同項目的沖突!

隨著需求的增多&#xff0c;又要增加多幾個不同的項目來在本地測試&#xff0c;這個時候往往就會遇到 不同項目的Python版本不同等等一系列問題&#xff0c;只好請出Conda來幫忙。 一、先去下載安裝一下Conda Conda | Anaconda.org 安裝完后&#xff0c;需要給CONDA做個環境變…

RK3568下的進程間廣播通信:用C語言構建簡單的中心服務器

最近的項目中需要實現這樣一個功能,就是一個進程A發消息,進程B和進程C都能收到相同的消息,同樣,進程B發消息,進程A和進程C也都能收到消息,就像下圖中的描述。 使用一個中心服務器作為消息轉發樞紐,所有客戶端連接到服務器,發送消息到服務器后,服務器再將消息轉發給所有…

激光雷達/相機一體機 時間同步和空間標定(1)

一、參考鏈接 海康威視、LIVOX與PTP時間同步_海康相機ptp同步-CSDN博客 基于PTP實現主機與相機系統時鐘同步功能_ptp同步-CSDN博客

嵌入式系統的中斷控制器(NVIC)

1. NVIC的核心功能 核心價值&#xff1a;NVIC通過硬件級中斷管理、自動狀態處理及低延遲優化&#xff0c;為實時系統提供確定性響應&#xff0c;是Cortex-M芯片實時性的基石。 中斷優先級管理 支持多級可編程優先級&#xff08;通常4-8位&#xff0c;如STM32用4位實現16級優先級…

【源力覺醒 創作者計劃】2025年國產AI模型深度測評:文心大模型4.5、DeepSeek、Qwen3能力大比拼

文章目錄引言&#xff1a;AI大模型的新時代一、模型架構與技術生態對比1. 文心大模型4.5系列2. DeepSeek3. 通義千問&#xff08;Qwen 3.0&#xff09;二、語言理解能力實測2.1 情感分析測試2.1.1 文心一言的表現2.1.2 DeepSeek的表現2.1.3 Qwen 3.0的表現2.1.4 測試結果分析2.…

從C++0基礎到C++入門(第十五節:switch語句)

一. switch語句1.1 語法結構如下&#xff1a;switch (表達式) {case 常量1:// 代碼塊1break;case 常量2:// 代碼塊2break;default:// 默認代碼塊 }1.2 注意 &#xff1a;表達式必須是整型或枚舉類型&#xff08;如int、char&#xff09;。case后的常量必須與表達式類型兼容。學…

編程與數學 03-002 計算機網絡 16_網絡編程基礎

編程與數學 03-002 計算機網絡 16_網絡編程基礎一、網絡編程的基本概念&#xff08;一&#xff09;客戶端與服務器模型&#xff08;二&#xff09;套接字&#xff08;Socket&#xff09;編程的基本原理二、基于TCP的網絡編程&#xff08;一&#xff09;TCP套接字的創建與使用&a…

在純servlet項目中,使用@WebFilter定義了多個filter,如何設置filter的優先級

在純 Servlet 項目中&#xff0c;WebFilter 注解本身并不提供直接的屬性來設置過濾器的優先級&#xff08;如過濾器執行的順序&#xff09;。但是&#xff0c;你可以通過以下幾種方式來控制過濾器的執行順序&#xff1a;1. 通過 web.xml 配置過濾器的順序在 web.xml 中&#xf…

關于鴉片戰爭的歷史

19世紀&#xff0c;英國東印度公司獲得了鴉片貿易的壟斷權&#xff0c;而猶太人是東印度公司的主要投資人之一&#xff0c;英國東印度公司又將鴉片經營權外包給了猶太人。其中&#xff0c;塞法迪猶太人控制了主要的鴉片交易&#xff0c;著名的沙遜家族就是當時臭名昭著的猶太鴉…

Maven - 并行安全無重復打包構建原理揭秘

作者&#xff1a;唐叔在學習 專欄&#xff1a;唐叔的Java實踐 標簽&#xff1a; #Maven并行構建 #Maven多線程打包 #Java構建優化 #Maven性能調優 #CI/CD加速 #Maven反應堆原理 #避免重復編譯 #高并發構建 文章目錄一、遇到問題&#xff1a;并行打包會不會翻車&#xff1f;二、…

phpyun人才系統v7.1使用升級補丁怎么從授權版升級至vip版?我說下我的技巧有資源的可以看過來,這樣就不用花錢麻煩官方了,新版本照樣支持小程序源碼

前:這個方法我只在Phpyun 的7.x系列使用過&#xff0c;低于這個版本的我暫時沒有研究過&#xff0c;我感覺大同小異&#xff01; 一. 升級前提條件 無論現在你使用的是商業版還是學習版 想垮系列升級你必須有對應的升級補丁&#xff0c;比如說你是授權版或旗艦版 想升級到最新的…