Spring全局異常處理最佳實踐

全局異常處理器詳解

什么是全局異常處理器?

全局異常處理器是Spring框架提供的統一異常處理機制,用于集中處理應用程序中所有控制器(Controller)層拋出的異常。它的核心價值在于:

  1. 統一異常處理:避免在每個Controller方法中重復編寫try-catch
  2. 標準化錯誤響應:確保所有異常返回一致的錯誤格式
  3. 解耦業務邏輯:將錯誤處理與業務代碼分離
  4. 提高可維護性:所有異常處理邏輯集中管理
  5. 增強安全性:防止敏感異常信息泄露給客戶端

核心實現方式

1. 使用 @ControllerAdvice + @ExceptionHandler(推薦)

@RestControllerAdvice // 組合了@ControllerAdvice和@ResponseBody
public class GlobalExceptionHandler {// 處理自定義業務異常@ExceptionHandler(BusinessException.class)public ResponseEntity<ErrorResponse> handleBusinessException(BusinessException ex) {ErrorResponse error = new ErrorResponse(ex.getErrorCode(),ex.getMessage(),System.currentTimeMillis());return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);}// 處理參數校驗異常@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity<ErrorResponse> handleValidationException(MethodArgumentNotValidException ex) {List<String> errors = ex.getBindingResult().getFieldErrors().stream().map(error -> error.getField() + ": " + error.getDefaultMessage()).collect(Collectors.toList());ErrorResponse error = new ErrorResponse("VALIDATION_FAILED","參數校驗失敗",errors,System.currentTimeMillis());return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);}// 處理認證授權異常@ExceptionHandler(AccessDeniedException.class)public ResponseEntity<ErrorResponse> handleAccessDeniedException(AccessDeniedException ex) {ErrorResponse error = new ErrorResponse("UNAUTHORIZED","無訪問權限",System.currentTimeMillis());return new ResponseEntity<>(error, HttpStatus.FORBIDDEN);}// 處理所有未捕獲的異常@ExceptionHandler(Exception.class)public ResponseEntity<ErrorResponse> handleAllExceptions(Exception ex) {// 生產環境應隱藏詳細錯誤信息String message = "生產環境".equals(env) ? "服務器內部錯誤" : ex.getMessage();ErrorResponse error = new ErrorResponse("INTERNAL_SERVER_ERROR",message,System.currentTimeMillis());log.error("未處理異常: ", ex);return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);}
}

2. 錯誤響應體結構(標準化)

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ErrorResponse {private String code;      // 錯誤碼private String message;   // 用戶友好消息private Object details;   // 錯誤詳情(可選)private long timestamp;   // 時間戳// 用于校驗錯誤的構造器public ErrorResponse(String code, String message, Object details, long timestamp) {this.code = code;this.message = message;this.details = details;this.timestamp = timestamp;}
}

企業級最佳實踐

1. 異常分類處理策略

異常類型HTTP狀態碼處理方式
業務邏輯異常400返回具體錯誤碼和用戶友好消息
參數校驗異常400返回具體字段錯誤信息
認證失敗異常401返回認證失敗提示
權限不足異常403返回權限不足提示
資源不存在異常404返回資源不存在提示
系統內部異常500返回通用錯誤(生產環境屏蔽細節)
服務不可用異常503返回服務維護提示

2. 自定義業務異常體系

// 基礎業務異常
public class BusinessException extends RuntimeException {private final String errorCode;public BusinessException(String errorCode, String message) {super(message);this.errorCode = errorCode;}public String getErrorCode() {return errorCode;}
}// 具體業務異常
public class UserNotFoundException extends BusinessException {public UserNotFoundException(Long userId) {super("USER_NOT_FOUND", "用戶不存在: " + userId);}
}public class InsufficientBalanceException extends BusinessException {public InsufficientBalanceException(BigDecimal balance) {super("INSUFFICIENT_BALANCE", "余額不足,當前余額: " + balance);}
}

3. 自動處理參數校驗

結合 @Valid 注解自動捕獲校驗異常:

@PostMapping("/users")
public UserDTO createUser(@Valid @RequestBody CreateUserRequest request) {// 業務邏輯
}// 在全局異常處理器中
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ErrorResponse> handleValidationException(MethodArgumentNotValidException ex) {// 提取所有字段錯誤Map<String, String> errors = ex.getBindingResult().getFieldErrors().stream().collect(Collectors.toMap(FieldError::getField,fieldError -> fieldError.getDefaultMessage() != null ? fieldError.getDefaultMessage() : ""));return ResponseEntity.badRequest().body(new ErrorResponse("VALIDATION_ERROR", "參數校驗失敗", errors));
}

4. 生產環境安全處理

@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleAllExceptions(Exception ex) {// 區分開發和生產環境String errorMessage = "系統錯誤";// 開發環境顯示詳細錯誤if ("dev".equals(environment.getProperty("spring.profiles.active"))) {errorMessage = ex.getMessage();}// 記錄完整錯誤日志log.error("未處理異常: ", ex);return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ErrorResponse("SERVER_ERROR", errorMessage));
}

高級功能擴展

1. 異常國際化支持

@ExceptionHandler(BusinessException.class)
public ResponseEntity<ErrorResponse> handleBusinessException(BusinessException ex, HttpServletRequest request) {// 從請求頭獲取語言String language = request.getHeader("Accept-Language");Locale locale = StringUtils.hasText(language) ? Locale.forLanguageTag(language) : Locale.getDefault();// 使用MessageSource獲取本地化消息String localizedMessage = messageSource.getMessage(ex.getErrorCode(), new Object[]{}, ex.getMessage(), // 默認消息locale);return ResponseEntity.badRequest().body(new ErrorResponse(ex.getErrorCode(), localizedMessage));
}

2. 異常監控集成

@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleAllExceptions(Exception ex) {// 發送異常到監控系統metricsService.recordException(ex);// 發送告警通知if (ex instanceof CriticalException) {alertService.sendCriticalAlert(ex);}// ... 其他處理
}

3. 自定義異常處理器順序

@Order(Ordered.HIGHEST_PRECEDENCE) // 最高優先級
@RestControllerAdvice
public class SecurityExceptionHandler {@ExceptionHandler(AuthenticationException.class)public ResponseEntity<ErrorResponse> handleAuthException(AuthenticationException ex) {// 特殊處理認證異常}
}@Order(Ordered.LOWEST_PRECEDENCE) // 最低優先級
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<ErrorResponse> handleAllExceptions(Exception ex) {// 兜底處理}
}

使用場景示例

Controller中的使用

@RestController
@RequestMapping("/api/orders")
public class OrderController {@PostMappingpublic ResponseEntity<OrderDTO> createOrder(@Valid @RequestBody CreateOrderRequest request) {// 業務代碼無需處理異常OrderDTO order = orderService.createOrder(request);return ResponseEntity.ok(order);}@GetMapping("/{id}")public ResponseEntity<OrderDTO> getOrder(@PathVariable Long id) {// 直接拋出業務異常OrderDTO order = orderService.getOrder(id).orElseThrow(() -> new OrderNotFoundException(id));return ResponseEntity.ok(order);}
}

最佳實踐總結

  1. 分層處理

    • 業務層拋出有含義的異常
    • 控制器層不處理異常
    • 全局處理器統一轉換異常為響應
  2. 標準化響應

    • 統一錯誤響應格式
    • 包含錯誤碼、消息和時間戳
    • 必要時添加錯誤詳情
  3. 異常分類

    • 為不同類型異常創建處理器
    • 使用HTTP狀態碼合理映射業務異常
  4. 安全考慮

    • 生產環境屏蔽敏感異常信息
    • 開發環境顯示詳細錯誤
  5. 監控集成

    • 記錄異常日志
    • 集成監控告警系統
  6. 可擴展性

    • 使用自定義異常體系
    • 支持異常國際化

全局異常處理器是構建健壯REST API的關鍵組件,它能顯著提高代碼質量、增強系統穩定性,并為客戶端提供一致的錯誤處理體驗。

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

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

相關文章

STL學習(十一、常用的算數算法和集合算法)

目錄 一、常用的算數算法 1.accmulate 2.fill 二、常用的集合算法 1.set_intersection 2.set_union 3.set_difference 一、常用的算數算法 包含頭文件為<numeric> 1.accmulate 函數原型 accmulate(iterator beg, iterator end, value) // 計算元素累計和 // …

DeepSort 算法分析詳解

DeepSort 算法分析詳解 DeepSort 簡介 DeepSort (Deep Learning Sort) 是一種基于深度學習的多目標跟蹤算法&#xff0c;由 Wojke 等人于 2017 年提出。它是對傳統 Sort (Simple Online and Realtime Tracking) 算法的改進&#xff0c;通過引入深度特征提取網絡來增強目標關聯的…

基于深度學習的醫學圖像分析:使用Capsule Networks實現醫學圖像分類

前言 醫學圖像分析是計算機視覺領域中的一個重要應用&#xff0c;特別是在醫學圖像分類任務中&#xff0c;深度學習技術已經取得了顯著的進展。醫學圖像分類是指將醫學圖像分配到預定義的類別中&#xff0c;這對于疾病的早期診斷和治療具有重要意義。近年來&#xff0c;Capsule…

G9打卡——ACGAN

&#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 1.導入庫及參數 import argparse import os import numpy as npimport torchvision.transforms as transforms from torchvision.utils import save_imagefrom…

應用war/jar包是用TongWeb企業版,還是嵌入版?

在判斷應用應該采用TongWeb哪個版本時&#xff0c;存在一種錯誤的觀點&#xff1a;如果應用包是jar包&#xff0c;則需要采用TongWeb嵌入版&#xff1b;如果應用包是war包&#xff0c;則需要采用TongWeb企業版。 正確的判斷方法&#xff1a;1. 首先應用為jar包&#xff0c;且符…

Linux ARM 平臺 C 語言操作 Excel 文件的常用庫與工具匯總(支持 xls 和 xlsx)

在 Linux 或嵌入式 ARM 平臺開發中&#xff0c;使用 C 語言操作 Excel 文件是一項常見需求&#xff0c;特別是在工業設備數據采集、日志導出、報表生成等場景。Excel 文件格式復雜&#xff0c;手工解析成本高&#xff0c;因此使用現成的庫可以極大簡化開發工作。 本文整理了若…

Apache Ignite 集群標識(Cluster ID)和集群標簽(Cluster Tag)

這是一個關于 Apache Ignite 集群標識&#xff08;Cluster ID&#xff09;和集群標簽&#xff08;Cluster Tag&#xff09; 的重要配置概念。我們來一步步深入理解這段文檔的含義&#xff0c;并結合實際場景說明其用途。&#x1f9e9; 一、核心概念&#xff1a;Cluster ID 與 C…

基于 Hadoop 生態圈的數據倉庫實踐 —— OLAP 與數據可視化(三)

目錄 三、Impala OLAP 實例 1. 建立 olap 庫、表、視圖 2. 初始裝載數據 3. 修改銷售訂單定期裝載腳本 4. 定義 OLAP 需求 5. 執行 OLAP 查詢 三、Impala OLAP 實例 本節使用前面銷售訂單的例子說明如何使用 Impala 做 OLAP 類型的查詢&#xff0c;以及實際遇到的問題及解…

如何不讓android studio自動換行

一、關閉逗號后自動換行設置 打開設置界面 進入 File → Settings &#xff08;Windows/Linux&#xff09;或 Preferences &#xff08;macOS&#xff09;。 導航至 Editor → Code Style → 選擇語言&#xff08;如 Java 或 Kotlin &#xff09;。 二、修改換行規則…

Jenkinsfile 報錯

Started by user 六件套Obtained Jenkinsfile from git https://gitee.com/duoshuijiao/vitepress-jenkins-cicd-demoorg.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:WorkflowScript: 28: Expected a step line 28, column 66.fingerprint:…

工業一體機全封閉抗干擾賦能自動化產線高效作業

在自動化產線智能設備等工業場景中&#xff0c;工業一體機的應用面臨多重挑戰&#xff1a;高溫、粉塵、電磁干擾等惡劣環境易導致設備誤操作&#xff0c;傳統工控機平均無故障時間不足4000小時&#xff1b;封閉車間散熱效率低下&#xff0c;風扇散熱失效風險增加&#xff0c;產…

鴻蒙NEXT開發筆記(二十八)仿抖音快手App的把位圖數據轉存為圖片

上一節我們利用Scroller實現了列表項的自動滾動功能&#xff0c;對于圖像列表來說&#xff0c;被選做封面的圖像需要保存為圖片文件&#xff0c;以便向服務器上傳封面圖片。 由于avImageGenerator從視頻提取的圖像幀數據為image.PixelMap&#xff08;位圖格式&#xff09;&…

四、搭建springCloudAlibaba2021.1版本分布式微服務-加入openFeign遠程調用和sentinel流量控制

OpenFeign遠程調用 1、OpenFeign OpenFeign是一種聲明式、模板化的HTTP客戶端。在Spring Cloud中使用OpenFeign&#xff0c;可以做到使用HTTP請求訪問遠程服務&#xff0c;就像調用本地方法一樣的&#xff0c;開發者完全感知不到這是在調用遠程方法&#xff0c;更感知不到在訪問…

網絡安全威脅——APT攻擊_apt攻擊預測案例

APT攻擊 1. 基本概念2. APT的攻擊階段3. APT的典型案例參考 1. 基本概念 高級持續性威脅&#xff08;APT&#xff0c;Advanced Persistent Threat&#xff09;&#xff0c;又叫高級長期威脅&#xff0c;是一種復雜的、持續的網絡攻擊&#xff0c;包含高級、長期、威脅三個要…

順時針旋轉N * N 的矩陣

順時針旋轉題目描述數據范圍實現邏輯代碼實現題目描述 有一個NxN整數矩陣&#xff0c;請編寫一個算法&#xff0c;將矩陣順時針旋轉90度。給定一個NxN的矩陣&#xff0c;和矩陣的階數N,請返回旋轉后的NxN矩陣。數據范圍 0<n<300&#xff0c;矩陣中的值滿足 0≤val≤100…

原生C++實現信號與槽機制:原理詳解

信號與槽機制是一種廣泛應用于事件驅動系統和GUI框架&#xff08;如Qt&#xff09;的設計模式。它允許組件之間通過訂閱-發布模式進行通信&#xff0c;從而實現松耦合的設計。本文將詳細講解如何在原生C中從零開始實現信號與槽機制&#xff0c;并深入探討其工作原理。一、信號與…

【人工智能】OpenAI的AI代理革命:通向超擬人交互的未來之路

人工智能代理(AI Agent)正引領一場深刻的技術變革,其核心在于賦予AI系統感知、規劃、行動和學習的能力,以自主完成復雜任務。OpenAI作為這一領域的先驅,通過其大型語言模型(LLMs)如GPT系列,極大地推動了AI代理的發展,使其在自然語言理解、生成和工具使用方面達到了前所…

Ubuntu虛擬機介紹、命令、安裝軟件指令(一)

Ubuntu介紹 Ubuntu 是一個基于 Debian 的開源 Linux 操作系統&#xff0c;由 Canonical 公司贊助開發。它是目前全球最流行的 Linux 發行版之一&#xff0c;以其用戶友好性、穩定性和強大的社區支持著稱。 核心特性 1.免費開源 完全免費使用和分發&#xff0c;遵循 GNU GPL…

企業微信服務商創建第三方應用配置數據回調url和指令回調url的java代碼實現

關鍵區別說明&#xff08;指令回調 vs 數據回調&#xff09;特性指令回調數據回調觸發場景授權/取消授權等管理事件通訊錄變更、應用菜單點擊等業務事件關鍵字段InfoTypeEvent ChangeType典型事件suite_auth, cancel_authchange_contact, suite_ticket響應要求必須返回加密的&…

LazyLLM教程 | 第2講:10分鐘上手一個最小可用RAG系統

貼心小梗概本文將介紹使用LazyLLM搭建最基礎的RAG的流程。首先介紹使用LazyLLM搭建RAG系統的必要環境配置&#xff0c;然后簡單回顧RAG的基本流程&#xff0c;接下來分別介紹RAG中文檔加載、檢索組件、生成組件三個關鍵部分的參數和基本使用方法&#xff0c;最后利用LazyLLM實現…