Spring Boot全局異常處理詳解

原代碼:

package com.weiyu.exception;import com.weiyu.pojo.Result;
import com.weiyu.utils.ErrorFileResponseUtils;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;/*** 全局異常處理器*/
@RestControllerAdvice
@SuppressWarnings("unused") // 使用這個注解來抑制警告 或 使用 @Component
@Slf4j
public class GlobalExceptionHandler {/*** 處理防抖異常(同時支持普通請求和文件下載請求)*/@ExceptionHandler(DebounceException.class)public Object handleDebounceException(DebounceException e, HttpServletRequest request) {// 文件下載請求返回錯誤文件if (ErrorFileResponseUtils.isFileDownloadRequest(request)) {return ErrorFileResponseUtils.createErrorFileResponse(e);}// 2. 普通請求返回 json 錯誤return Result.error(e.getMessage(), e.getCode());}/*** 處理其他所有異常*/@ExceptionHandler(Exception.class)public Object handleException(Exception e, HttpServletRequest request) {// ? 禁止使用 printStackTrace 在控制臺輸出異常的詳細堆棧跟蹤信息// e.printStackTrace();// ? 規范做法:使用日志框架記錄異常(參數 e 包含異常的詳細堆棧跟蹤信息)log.error("異常錯誤 {}", e.getMessage(), e);// 文件下載請求返回錯誤文件if (ErrorFileResponseUtils.isFileDownloadRequest(request)) {String message = StringUtils.hasLength(e.getMessage()) ? e.getMessage() : "下載文件失敗";return ErrorFileResponseUtils.createErrorFileResponse(message, HttpStatus.INTERNAL_SERVER_ERROR);}// 普通請求返回 json 錯誤return Result.error(StringUtils.hasLength(e.getMessage()) ? e.getMessage() : "操作失敗", 500);}
}

以下是對提供的Spring Boot全局異常處理代碼的詳細注釋和作用說明:

package com.weiyu.exception;import com.weiyu.pojo.Result;                   // 自定義的統一響應對象
import com.weiyu.utils.ErrorFileResponseUtils;  // 處理錯誤文件響應的工具類
import jakarta.servlet.http.HttpServletRequest; // 獲取HTTP請求信息
import lombok.extern.slf4j.Slf4j;               // Lombok日志注解
import org.springframework.http.HttpStatus;     // HTTP狀態碼枚舉
import org.springframework.util.StringUtils;    // Spring字符串工具類
import org.springframework.web.bind.annotation.ExceptionHandler;        // 異常處理器注解
import org.springframework.web.bind.annotation.RestControllerAdvice;    // 控制器增強注解/*** 全局異常處理器* 作用:集中處理整個應用程序中控制器層拋出的異常*/
@RestControllerAdvice       // 組合注解:包含 @ControllerAdvice + @ResponseBody,使返回值自動轉為JSON
@SuppressWarnings("unused") // 使用這個注解來抑制警告 或 使用 @Component
@Slf4j                      // 自動生成日志對象
public class GlobalExceptionHandler {/*** 處理防抖異常(DebounceException),同時支持普通請求和文件下載請求* 適用場景:當檢測到重復/頻繁請求時拋出的自定義異常** @param e 捕獲的防抖異常對象* @param request HTTP請求對象* @return 根據請求類型返回不同響應:文件下載請求返回錯誤文件,普通請求返回JSON錯誤信息*/@ExceptionHandler(DebounceException.class)  // 指定處理的異常類型public Object handleDebounceException(DebounceException e, HttpServletRequest request) {// 1. 檢查是否為文件下載請求if (ErrorFileResponseUtils.isFileDownloadRequest(request)) {// 生成包含錯誤信息的文件響應(如txt)return ErrorFileResponseUtils.createErrorFileResponse(e);}// 2. 普通請求返回統一JSON錯誤格式return Result.error(e.getMessage(), e.getCode());}/*** 處理所有其他未明確指定的異常(頂級異常處理器)* 作用:作為異常處理的兜底方案,確保所有異常都被處理*/@ExceptionHandler(Exception.class)  // 捕獲所有未被處理的異常public Object handleException(Exception e, HttpServletRequest request) {// ? 禁止使用 printStackTrace 在控制臺輸出異常的詳細堆棧跟蹤信息// e.printStackTrace();// ? 規范日志記錄:使用日志框架記錄完整異常堆棧(參數 e 包含異常的詳細堆棧跟蹤信息)log.error("異常錯誤 {}", e.getMessage(), e);    // 記錄錯誤消息和詳細堆棧跟蹤信息// 1. 處理文件下載請求的異常if (ErrorFileResponseUtils.isFileDownloadRequest(request)) {// 確保錯誤消息不為空,使用默認消息兜底String message = StringUtils.hasLength(e.getMessage()) ? e.getMessage() : "下載文件失敗";// 生成包含錯誤信息的文件響應,使用500狀態碼return ErrorFileResponseUtils.createErrorFileResponse(message, HttpStatus.INTERNAL_SERVER_ERROR);}// 2. 普通請求的異常處理return Result.error(StringUtils.hasLength(e.getMessage()) ? e.getMessage() : "操作失敗",    // 消息處理500 // 統一返回500服務器錯誤狀態碼);}
}

核心作用解析:

  1. 統一異常處理

    • 通過@RestControllerAdvice注解實現全局攔截控制器層拋出的異常

    • 避免在每個Controller中重復編寫異常處理代碼

  2. 差異化響應處理

  3. 自定義異常處理(DebounceException)

    • 專門處理防抖邏輯相關的異常

    • 使用異常自帶的錯誤碼和消息(e.getCode()e.getMessage()

    • 示例場景:限制用戶頻繁提交表單/重復請求

  4. 全局兜底處理(Exception.class)

    • 捕獲所有未被特殊處理的異常

    • 關鍵安全實踐:禁止使用printStackTrace()(會暴露敏感信息)

    • 正確做法:通過日志框架記錄完整堆棧(log.error("msg", e)

  5. 空消息安全處理

    • 使用StringUtils.hasLength()檢查消息有效性

    • 提供默認友好提示("操作失敗"/"下載文件失敗")

    • 避免返回空錯誤信息導致客戶端解析失敗

  6. HTTP狀態碼管理

    • 普通請求:返回500錯誤碼(通過Result對象封裝)

    • 文件請求:設置HTTP狀態為500(HttpStatus.INTERNAL_SERVER_ERROR

最佳實踐亮點:

  1. 日志規范

    java

    // 錯誤做法(禁止): 暴露堆棧到控制臺
    // e.printStackTrace(); // 正確做法(采用): 日志系統記錄完整錯誤
    log.error("異常詳細信息: {}", e.getMessage(), e);
  2. 擴展性設計

    • 通過ErrorFileResponseUtils工具類分離文件處理邏輯

    • 便于后續擴展其他文件類型處理

  3. 防御式編程

    • e.getMessage()進行空值檢測

    • 使用工具類方法判斷請求類型(isFileDownloadRequest

  4. 響應標準化

    • 統一使用Result對象返回JSON格式錯誤

    json

    // 響應示例
    {"code": 500,"msg": "操作失敗","data": null
    }

該實現有效解決了Spring Boot應用中的三個核心異常處理問題:
① 異常類型差異化處理 ② 響應形式自適配(JSON/文件) ③ 生產環境安全的錯誤日志記錄

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

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

相關文章

FHE技術將徹底改變在線隱私保護方式

1. 在線隱私的簡史 互聯網剛剛誕生時,所有的內容都是未加密的。人們通過一個特定的地址訪問網站,這個地址以“HTTP”開頭。當時,這并不是什么大問題,因為人們在線訪問的都是內容,而這些內容本身已經是公開的。但隨著電…

Cursor配置Java環境、創建Spring Boot項目

一:配置JDK和Maven cursor默認會讀取環境變量JAVA_HOME和MAVEN_HOME,如果沒有配置去找默認路徑~/.m2/settings.xml也可以手動指定:Ctrl Shift P 輸入"Preferences:Open User Settings(JSON)"打開settings.json文件,然…

win11添加無線顯示器(兩個筆記本實現雙屏)

前置條件: 兩個筆記本要要支持無線顯示器,支持藍牙; 1、自己重裝的win11系統,首先根據網上說明進去的時候,紅色顯示無無線投屏; 2、安裝網上操作,查看自己電腦是否支持無線投屏(是支…

【MAC技巧】Bash/Zsh切換失敗的故障排除

【MAC技巧】Bash/Zsh切換失敗的故障排除 Troubleshooting to Failure " chsh: no changes made" By JacksonML 在Mac電腦中,終端(Terminal)是常用的命令行工具,對開發和運維至關重要。 依照蘋果電腦的系統軟件迭代,終端中存有B…

卷積神經網絡-卷積的分類

卷積的定義卷積是圖像處理中最核心的操作之一,其本質是通過卷積核(濾波器)與圖像進行滑動窗口計算(像素值乘積之和),實現對圖像特征的提取、增強或抑制。一、二維卷積--針對二維矩陣進行處理1.1單通道見得最…

全網首發:使用GIT下載時崩潰退出,是因為機械硬盤

前面有幾篇文章,說是GIT下載會退出。開始以為是虛擬機問題。把家里的虛擬機復制到公司,照樣崩潰。后來認為是內存不足。昨天在家里下載代碼,也崩潰退出。心里覺得奇怪,試了一次,還是退出。差別在哪里?之前是…

YAML 自動化用例中 GET vs POST 請求的參數寫法差異

GET 請求:用 params 傳參(附加在 URL 上) config:name: "GET 查詢用戶信息"base_url: "https://api.example.com"teststeps:- name: "根據 userId 查詢用戶信息"request:method: GETurl: /api/user/detailpara…

使用 SeaTunnel 建立從 MySQL 到 Databend 的數據同步管道

SeaTunnel 是一個非常易用、超高性能的分布式數據集成平臺,支持實時海量數據同步。 每天可穩定高效地同步數百億數據,已被近百家企業應用于生產,在國內較為普及。 Databend 是一款開源、彈性、低成本,基于對象存儲也可以做實時分…

linux服務器換ip后客戶端無法從服務器下載數據到本地問題處理

服務器換ip后客戶端無法從服務器下載數據到本地,根據上圖提示,讓用戶清理下~/.ssh/known_hosts文件,下載恢復正常。

從0到1實現Shell!Linux進程程序替換詳解

目錄從0到1實現Shell!Linux進程程序替換詳解 🚀引言:為什么進程需要"變身術"?一、程序替換:進程的"換衣服"魔法 🔄1.1 什么是程序替換?1.2 程序替換的原理:內存…

暑期算法訓練.2

目錄 6.力扣 11.盛水最多的容器 6.1 題目解析: 6.2 算法思路: 6.2.1 暴力解法: 6.2.2 優化算法: 6.3 代碼演示: ?編輯 6.4 總結反思: 7.力扣 611.有效的三角形個數 7.1 題目解析: 7.2…

華為OD 消消樂游戲

1. 題意 游戲規則:輸入一個只包含英文字母的字符串,字符串中的兩個字母如果相鄰且相同,就可以消除。 在字符串上反復執行消除的動作,直到無法繼續消除為止,此時游戲結束。 輸出最終得到的字符串長度。 輸入 輸入原始…

小白學HTML,操作HTML文件篇(2)

目錄 一、添加多媒體 1.添加網頁圖片 2.添加網頁音頻 3.添加網頁視頻 二、創建容器 1. 標簽 2.布局 三、創建表格 1.表格標簽 2.添加表格表頭 3.添加表格標題 一、添加多媒體 在 HTML 網頁中可以輕松地使用標簽來添加圖片、音頻、視頻等多媒體,而這些多媒體并…

微服務架構中實現跨服務的字段級權限統一控制

結合集中式權限管理、分布式上下文傳遞、動態策略執行等技術 ??一、核心架構設計?? ??1. 分層控制模型?? ??網關層??:統一校驗用戶身份與基礎權限,攔截非法請求。 ??服務層??:基于用戶權限動態過濾數據字段,實現業務級控制。 ??策略中心??:集中管理權…

【實現100個unity特效之27】使用unity的ShaderGraph實現一個帶裁剪邊緣光的裁剪效果(2d3d通用)

文章目錄普通裁剪效果1、創建一個Lit Shader Graph2、ShaderGraph前置配置3、添加節點4、效果5、修改裁剪方向帶邊緣色的裁剪1、在裁剪的基礎上添加裁剪邊緣光2、邊緣的亮度3、修改裁剪方向4、效果5、我們可以代碼控制它的變化,如下2D3D游戲通用專欄推薦完結普通裁剪…

Android Scoped Storage適配完全指南

Android Scoped Storage適配完全指南關鍵詞:Android、Scoped Storage、適配、存儲權限、文件訪問摘要:本文將全面介紹Android Scoped Storage的相關知識,從背景出發,詳細解釋核心概念,闡述其原理和架構,給出…

Typecho集成PHPMailer實現郵件訂閱功能完整指南

文章目錄 Typecho使用PHPMailer實現文章推送訂閱功能詳解 1. 背景與需求分析 1.1 為什么選擇PHPMailer 1.2 功能需求 2. 環境準備與配置 2.1 安裝PHPMailer 2.2 數據庫設計 3. 核心功能實現 3.1 郵件服務封裝類 3.2 訂閱功能實現 3.2.1 訂閱表單處理 3.2.2 確認訂閱處理 3.3 文…

無線-二層組網-直接轉發

文章目錄無線二層組網直接轉發🏡作者主頁:點擊! 🤖Datacom專欄:點擊! ??創作時間:2025年07月16日08點00分 無線二層組網 直接轉發 本地轉發中所有的沿途都需要配置對應VLAN的通過&#xff…

gin go-kratos go-zero框架對比

Gin、Go-Kratos 和 Go-Zero 是 Go 語言中三種常見的服務框架,它們在定位、設計理念、復雜度和適用場景上差異較大。下面我們從功能定位、設計理念、優劣對比、使用建議等維度進行深入對比。🧭 一句話總結框架定位Gin輕量級、高性能的 HTTP 路由框架Go-Kr…

4G模塊 A7670發送英文短信到手機

命令說明ATi顯示產品的標志信息 ATCIMI查詢IMSI ATCICCID從SIM卡讀取ICCID ATCGSN查詢產品序列號 ATCPIN查詢卡狀態 ATCSQ查詢信號強度 ATCGATT查詢當前PS域狀態 ATCREG查詢GPRS注冊狀態 ATCEREG查詢4G注冊狀態 ATCGPADDR查詢PDP地址 ATCMGF選擇短信格式 ATCMGS發送短信流程第一…