【SpringBoot】24 核心功能 - Web開發原理 -Spring Boot 異常處理機制

前言

在開發 Web 應用程序時,異常處理是一個至關重要的部分。Spring Boot 提供了一套強大的異常處理機制,使得開發者能夠輕松地處理和響應各種異常情況。本文將深入探討 Spring Boot 中的異常處理機制,包括默認的錯誤處理規則、定制錯誤處理邏輯以及異常處理的自動配置原理。

一、默認錯誤處理規則

在默認情況下,Spring Boot 提供了 /error 路徑來處理所有錯誤的映射。當應用程序發生異常時,Spring Boot 會自動將請求路由到這個默認的錯誤處理路徑。

對于機器客戶端(如 API 調用),Spring Boot 會生成一個 JSON 響應,其中包含錯誤的狀態碼(HTTP 狀態)和異常消息的詳細信息。以下是一個示例 JSON 響應:

{"timestamp": "2024-07-19T08:22:25.669+00:00","status": 404,"error": "Not Found","message": "No message available","path": "/asadada"
}

對于瀏覽器客戶端,Spring Boot 會響應一個“whitelabel”錯誤視圖,以 HTML 格式呈現相同的數據。這個默認的錯誤頁面雖然簡單,但能提供基本的錯誤信息。

二、定制錯誤處理邏輯

1. 自定義錯誤頁

我們可以創建自定義的錯誤頁面來替換默認的“whitelabel”錯誤視圖。例如,創建 error/404.htmlerror/5xx.html 文件,Spring Boot 會根據不同的 HTTP 狀態碼自動選擇對應的錯誤頁面進行渲染。

2. 使用 @ControllerAdvice@ExceptionHandler

通過實現 ErrorController 并注冊該類型的 Bean 定義,或者添加 ErrorAttributes 類型的組件,我們可以完全替換默認的錯誤處理行為。更常見和靈活的方式是使用 @ControllerAdvice@ExceptionHandler 注解。

以下是一個示例代碼:

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<Object> handleAllExceptions(Exception ex, WebRequest request) {// 可以在這里記錄異常日志String errorMessage = "An unexpected error occurred: " + ex.getMessage();return new ResponseEntity<>(errorMessage, HttpStatus.INTERNAL_SERVER_ERROR);}@ExceptionHandler(NotFoundException.class)public ResponseEntity<Object> handleNotFoundException(NotFoundException ex, WebRequest request) {String errorMessage = "Resource not found: " + ex.getMessage();return new ResponseEntity<>(errorMessage, HttpStatus.NOT_FOUND);}
}

在上述代碼中,@ControllerAdvice 注解表示這是一個全局的異常處理器。@ExceptionHandler 注解用于指定處理特定類型異常的方法。當發生 Exception 類型的異常時,handleAllExceptions 方法會被調用;當發生 NotFoundException 類型的異常時,handleNotFoundException 方法會被調用。

3. 實現 HandlerExceptionResolver

我們還可以通過實現 HandlerExceptionResolver 接口來自定義異常處理邏輯。這個接口定義了一個 resolveException 方法,我們可以在這個方法中處理異常并返回一個 ModelAndView 對象。

以下是一個簡單的示例:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;public class CustomHandlerExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {// 處理異常邏輯ModelAndView modelAndView = new ModelAndView("error/500");modelAndView.addObject("errorMessage", ex.getMessage());return modelAndView;}
}

三、異常處理自動配置原理

Spring Boot 通過 ErrorMvcAutoConfiguration 類自動配置異常處理規則。在這個配置類中,定義了多個組件:

  1. DefaultErrorAttributes:實現了 ErrorAttributesHandlerExceptionResolver 接口,用于收集和提供錯誤屬性信息。
  2. BasicErrorController:處理 /error 路徑的請求,根據請求的類型(HTML 或 JSON)返回相應的錯誤響應。
  3. BeanNameViewResolver:視圖解析器,按照返回的視圖名作為組件的 id 去容器中找視圖對象。
  4. DefaultErrorViewResolver:如果發生錯誤,會以 HTTP 的狀態碼作為視圖頁地址(viewName),找到真正的頁面。

以下是 ErrorMvcAutoConfiguration 類中部分組件的定義示例:

@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(prefix = "server.error.whitelabel", name = "enabled", matchIfMissing = true)
@ConditionalOnClass(EmbeddedWebApplication.class)
public class ErrorMvcAutoConfiguration {// 定義 DefaultErrorAttributes@Bean@ConditionalOnMissingBean(value = ErrorAttributes.class, search = SearchStrategy.CURRENT)public DefaultErrorAttributes errorAttributes() {return new DefaultErrorAttributes();}// 定義 BasicErrorController@Bean@ConditionalOnMissingBean(value = ErrorController.class, search = SearchStrategy.CURRENT)public BasicErrorController basicErrorController(ErrorAttributes errorAttributes, ObjectProvider<ErrorViewResolver> errorViewResolvers) {return new BasicErrorController(errorAttributes, errorViewResolvers.orderedStream().collect(Collectors.toList()));}// 其他組件定義...
}

四、異常處理步驟流程

  1. 執行目標方法:當目標方法運行期間發生任何異常時,會被 catch,并且標志當前請求結束,使用 dispatchException 進入視圖解析流程(頁面渲染?)。
  2. 調用 processDispatchResult 方法:該方法處理派發結果,包括處理異常。
  3. 處理 HandlerException:遍歷所有的 handlerExceptionResolvers,看誰能處理當前異常。

系統默認的異常解析器包括 DefaultErrorAttributesHandlerExceptionResolverComposite 等。DefaultErrorAttributes 先來處理異常,把異常信息保存到 request 域,并且返回 null。如果沒有任何人能處理異常,異常會被拋出,最終由底層的 BasicErrorController 處理,解析錯誤視圖。

總結

Spring Boot 的異常處理機制提供了靈活且強大的方式來處理應用程序中的各種異常情況。通過默認的錯誤處理規則、定制錯誤處理邏輯以及理解異常處理的自動配置原理,我們可以更好地構建健壯的 Web 應用程序。在實際開發中,根據具體的需求選擇合適的異常處理方式,能夠提高應用程序的穩定性和用戶體驗。

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

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

相關文章

JVM第一部分

PC寄存器&#xff1a;存儲的是數字 0, 3, 6, 10, 17 這樣的字節碼偏移量。 LineNumberTable&#xff1a;是一個映射表&#xff0c;它將上述的偏移量“翻譯”成我們程序員能看懂的源代碼行號。 JVM堆 JVM堆由兩部分組成&#xff1a;年輕代老年代 年輕代包括三部分&#xff1a;ed…

IDEA使用Maven和MyBatis簡化數據庫連接(配置篇)

目錄&#xff1a; Maven:簡化項目構建 MyBatis:簡化Jdbc Maven&#xff1a;是一款項目構建與依賴管理工具&#xff0c;核心作用是自動化項目編譯、打包等流程&#xff0c;并統一管理項目所需的第三方 Jar 包&#xff08;如 MyBatis 的 Jar 包&#xff09;。 MyBatis&#xf…

Java 泛型詳解:從基礎到高級應用

目錄 一、泛型的基本概念 為什么需要泛型&#xff1f; 二、泛型類與泛型接口 【1】定義泛型類 【2】定義泛型接口 三、泛型方法 四、泛型通配符 【1】無界通配符&#xff08;?&#xff09; 【2】上界通配符&#xff08;? extends T&#xff09; 【3】下界通配符&am…

嵌入式 Linux 啟動機制全解析:從 Boot 到 Rootfs

&#x1f680; 嵌入式 Linux 啟動機制全解析&#xff1a;從 Boot 到 Rootfs 在嵌入式系統中&#xff0c;Linux 的啟動流程不僅是內核加載的過程&#xff0c;更是 bootloader、設備樹、初始根文件系統、啟動配置文件等多個組件協同工作的結果。不同的文件系統和啟動方式會影響系…

Python 操作Office的PPT、Word、Excel,同時兼容WPS

文章目錄概要一、環境準備1. 安裝必要的Python庫2. 系統要求二、核心實現原理1. 檢測已安裝的Office類型2. 初始化對應的應用程序三、完整代碼實現四、使用示例五、WPS兼容處理詳解1. 形狀和文本框訪問兼容處理2. PPT圖片粘貼兼容處理3. 資源釋放的重要性六、圖片操作實現詳解1…

ISP之DHCPv6-PD(前綴代理)為用戶下發前綴

一、組網需求家庭用戶要使用IPv6地址接入互聯網。為方便用戶接入&#xff0c;運營商使用DHCPv6-PD的方式給家用路由器下發IPv6地址前綴&#xff0c;用戶路由器LAN側不需要手工指定鏈路的IPv6地址前綴&#xff0c;家用路由器可以給用戶終端自動配置IPv6地址和其它網絡參數。本例…

Django全棧班v1.04 Python基礎語法 20250912 上午

rm 刪除命令 注意&#xff1a;刪除操作是不可逆的&#xff0c;一旦刪除就無法撤銷&#xff0c;請謹慎使用。刪除文件&#xff1a; rm file.py遞歸刪除目錄&#xff1a; rm -r demo/強制刪除&#xff1a; rm -f file.py交互式刪除&#xff1a; rm -i *.txt課程定位 “學習Python…

Java 21 虛擬線程高并發落地:中間件適配、場景匹配與細節優化的技術實踐

作為 Java 21 的核心特性,虛擬線程(Virtual Thread)憑借 “用戶態調度”“輕量級資源占用” 的優勢,成為高并發場景下線程模型優化的重要方向。但在實際落地中,不少團隊會陷入 “技術用了卻沒效果” 的困境 ——QPS 提升有限、中間件調用阻塞、CPU 使用率異常升高。 本文…

數據庫在并發訪問時,不同隔離級別下臟讀幻讀問題

數據庫隔離級別并非安裝后就固定&#xff0c;絕大多數主流數據庫&#xff08;如MySQL、PostgreSQL、SQL Server&#xff09;都支持動態調整和運行中自定義&#xff0c;具體調整范圍可分為全局、會話和語句三個層級。 全局級別調整&#xff1a;修改數據庫配置文件&#xff08;如…

JVM從入門到實戰:從字節碼組成、類生命周期到雙親委派及打破雙親委派機制

摘要&#xff1a;本文圍繞 Java 字節碼與類加載機制展開&#xff0c;詳解字節碼文件組成、類的生命周期&#xff0c;介紹類加載器分類、雙親委派機制及打破該機制的方式&#xff0c;還闡述了線程上下文類加載器與 SPI 機制在 JDBC 驅動加載中的應用&#xff0c;幫助深入理解 Ja…

多源最短路(Floyd算法

多源最短路簡介 多源最短路算法用于解決圖中任意兩節點間最短路徑的問題&#xff0c;廣泛應用于交通網絡、社交關系分析、路由優化等場景。與單源最短路&#xff08;如Dijkstra&#xff09;不同&#xff0c;它一次性計算所有節點對的最短距離&#xff0c;適合需要全局路徑規劃的…

【攻防實戰】記一次攻防實戰全流程

那天我向眾神祈禱&#xff0c;最后回答我的卻只有掙扎十年依舊不甘的自己&#xff01;成功究竟是饋贈還是償還。 前言 網絡安全技術學習&#xff0c;承認??的弱點不是丑事&#xff0c;只有對原理了然于?&#xff0c;才能突破更多的限制。 擁有快速學習能力的安全研究員&…

Anaconda配置環境變量和鏡像

Anaconda配置環境變量和鏡像 下載失敗就是開了梯子 Anaconda 作用&#xff1a;包管理&#xff08;集中&#xff0c;有序&#xff09;和環境管理&#xff08;版本切換&#xff09;使用conda命令對虛擬環境創建、刪除自帶python解釋器pip&#xff08;python自帶的包管理工具&…

給定單詞倒排

實現代碼&#xff1a;public static void main(String[] args) {Scanner scanner new Scanner(System.in);// 輸入的字符串String input scanner.nextLine();// 存儲單詞List<String> words new ArrayList<>();// 存儲當前單詞StringBuilder currentWord new S…

IO進程——進程引入、進程函數接口

一、引入1、進程&程序1.1 程序編譯好的可執行的文件存放在磁盤上的指令和數據的有序集合&#xff08;文件&#xff09;程序是靜態的&#xff0c;沒有任何執行的概念1.2 進程一個獨立的可調度的任務執行一個程序所分配的資源的總稱進程是程序執行的一次過程進程是動態的&…

周末游戲推薦:安卓端俄羅斯方塊,經典與創新的結合

前段時間&#xff0c;每到周末我都會給大家推薦一些離線的經典游戲&#xff0c;原本打算將這個傳統一直延續下去。然而&#xff0c;我實在找不到足夠好用且無廣告的游戲了。有些游戲剛開始用的時候還不錯&#xff0c;但用著用著就開始頻繁彈出廣告&#xff0c;這讓我實在不敢向…

《用 Scikit-learn 構建 SVM 分類模型:從原理到實戰的全流程解析》

《用 Scikit-learn 構建 SVM 分類模型:從原理到實戰的全流程解析》 一、引言:為什么選擇 SVM? 在機器學習的眾多算法中,支持向量機(SVM)以其強大的分類能力和良好的泛化性能,在文本分類、人臉識別、醫學診斷等領域廣泛應用。尤其在中小規模數據集上,SVM 往往能提供比…

一文學會CMakeLists.txt: CMake現代C++跨平臺工程化實戰

你能學到什么&#xff1f;朋友們好久不見&#xff0c;我是alibli&#xff0c;好久沒有更新博客了。今天本人將通過構造一個實際的虛擬小項目&#xff0c;來讓你徹底掌握CMake跨平臺工程構建&#xff0c;學會CMakeLists.txt語法。該項目實現了一個簡單的平方、立方的計算程序&am…

高并發場景下限流算法實踐與性能優化指南

高并發場景下限流算法實踐與性能優化指南 在大規模并發訪問環境中&#xff0c;合理的限流策略能保護后端服務穩定運行&#xff0c;避免系統因瞬時高并發導致資源耗盡或崩潰。本文將從原理出發&#xff0c;深入解析幾種主流限流算法&#xff0c;并結合Java和Redis給出完整可運行…

Vue3應用執行流程詳解

精確化的完整執行流程 (以 Vite Vue3 SPA 為例)整個過程可以分為兩部分&#xff1a;首次訪問的“冷啟動”和后續的Vue應用接管。第一部分&#xff1a;首次訪問與頁面加載客戶端&#xff1a;發送請求用戶打開瀏覽器&#xff0c;輸入 URL&#xff08;如 http://localhost:5173&a…