SpringMVC-全局異常處理

文章目錄

  • 1. 全局異常處理
  • 2. 項目異常處理方案
    • 2.1 異常分類
    • 2.2 異常解決方案
    • 2.3 異常解決方案具體實現

1. 全局異常處理

  • 問題:當我們在SpingMVC代碼中沒有對異常進行處理時,三層架構的默認處理異常方案是將異常拋給上級調用者。也就是說Mapper層報錯會將異常上拋給Service層,Service層報錯會將異常上拋給Controller層,最終拋給框架之后會把各種各樣的錯誤信息直接返回給前端,前端往往難以解析這些五花八門的異常。

  • 解決方案:SpingMVC提供了全局異常處理器,捕獲不同的異常進行特定的處理。

    在這里插入圖片描述

  • 實現方法:

    1. 上加@RestControllerAdvice注解,加上這個注解就代表我們定義了一個全局異常處理器,同時需要確保該類能夠被Spring容器掃描到

      @RestControllerAdvice = @ControllerAdvice + @ResponseBody

      處理異常的方法返回值會轉換為Json后再響應給前端

      在這里插入圖片描述

    2. 在全局異常處理器當中,需要定義一個方法來捕獲異常,在這個方法上需要加上注解@ExceptionHandler。通過@ExceptionHandler注解當中的value屬性來指定我們要捕獲的是哪一類型的異常。

      @RestControllerAdvice
      public class GlobalExceptionHandler {//處理異常@ExceptionHandler(Exception.class) //指定能夠處理的異常類型public Result ex(Exception e){e.printStackTrace(); //打印堆棧中的異常信息//捕獲到異常之后,響應一個標準的Resultreturn Result.error("對不起,操作失敗,請聯系管理員");}
      }
      

2. 項目異常處理方案

2.1 異常分類

  • 因為異常的種類有很多,如果每一個異常都對應一個@ExceptionHandler,那得寫多少個方法來處理各自的異常,所以我們在處理異常之前,需要對異常進行一個分類:

    • 業務異常(BusinessException)

      • 規范的用戶行為產生的異常

        • 用戶在頁面輸入內容的時候未按照指定格式進行數據填寫,如在年齡框輸入的是字符串

          在這里插入圖片描述

      • 不規范的用戶行為操作產生的異常

        • 如用戶故意傳遞錯誤數據

          在這里插入圖片描述

    • 系統異常(SystemException)

      • 項目運行過程中可預計但無法避免的異常
        • 比如數據庫或服務器宕機
    • 其他異常(Exception)

      • 編程人員未預期到的異常,如:用到的文件不存在

        在這里插入圖片描述

    將異常分類以后,針對不同類型的異常,要提供具體的解決方案:

2.2 異常解決方案

  • 業務異常(BusinessException)
    • 發送對應消息傳遞給用戶,提醒規范操作
      • 大家常見的就是提示用戶名已存在或密碼格式不正確等
  • 系統異常(SystemException)
    • 發送固定消息傳遞給用戶,安撫用戶
      • 系統繁忙,請稍后再試
      • 系統正在維護升級,請稍后再試
      • 系統出問題,請聯系系統管理員等
    • 發送特定消息給運維人員,提醒維護
      • 可以發送短信、郵箱或者是公司內部通信軟件
    • 記錄日志
      • 發消息和記錄日志對用戶來說是不可見的,屬于后臺程序
  • 其他異常(Exception)
    • 發送固定消息傳遞給用戶,安撫用戶
    • 發送特定消息給編程人員,提醒維護(納入預期范圍內)
      • 一般是程序沒有考慮全,比如未做非空校驗等
    • 記錄日志

2.3 異常解決方案具體實現

  1. 自定義異常類:添加code屬性以區分異常來自哪個業務。

    //自定義異常處理器,用于封裝異常信息,對異常進行分類
    @Data
    public class SystemException extends RuntimeException{private Integer code;public SystemException(Integer code, String message) {super(message);this.code = code;}public SystemException(Integer code, String message, Throwable cause) {super(message, cause);this.code = code;}
    }//自定義異常處理器,用于封裝異常信息,對異常進行分類
    @Data
    public class BusinessException extends RuntimeException{private Integer code;public BusinessException(Integer code, String message) {super(message);this.code = code;}public BusinessException(Integer code, String message, Throwable cause) {super(message, cause);this.code = code;}
    }
    
    //狀態碼
    public class Code {public static final Integer SAVE_OK = 20011;public static final Integer DELETE_OK = 20021;public static final Integer UPDATE_OK = 20031;public static final Integer GET_OK = 20041;public static final Integer SAVE_ERR = 20010;public static final Integer DELETE_ERR = 20020;public static final Integer UPDATE_ERR = 20030;public static final Integer GET_ERR = 20040;public static final Integer SYSTEM_ERR = 50001;public static final Integer SYSTEM_TIMEOUT_ERR = 50002;public static final Integer SYSTEM_UNKNOW_ERR = 59999;public static final Integer BUSINESS_ERR = 60002;
    }
  2. 將其他異常換成自定義異常:

    public Book getById(Integer id) {//模擬業務異常,包裝成自定義異常if(id == 1){throw new BusinessException(Code.BUSINESS_ERR,"業務異常,用戶注意相關格式");}//模擬系統異常,將可能出現的異常進行包裝,轉換成自定義異常try{int i = 1/0;}catch (Exception e){throw new SystemException(Code.SYSTEM_TIMEOUT_ERR,"服務器訪問超時,請重試!",e);}return bookDao.getById(id);
    }
    
  3. 處理器類中處理自定義異常:

    //@RestControllerAdvice用于標識當前類為REST風格對應的異常處理器
    @RestControllerAdvice
    public class ProjectExceptionAdvice {@ExceptionHandler(SystemException.class)public Result doSystemException(SystemException ex){//記錄日志//發送消息給運維//發送郵件給開發人員,ex對象發送給開發人員return new Result(ex.getCode(),null,ex.getMessage());}@ExceptionHandler(BusinessException.class)public Result doBusinessException(BusinessException ex){return new Result(ex.getCode(),null,ex.getMessage());}//除了自定義的異常處理器,保留對Exception類型的異常處理,用于處理非預期的異常@ExceptionHandler(Exception.class)public Result doOtherException(Exception ex){//記錄日志//發送消息給運維//發送郵件給開發人員,ex對象發送給開發人員return new Result(Code.SYSTEM_UNKNOW_ERR,null,"系統繁忙,請稍后再試!");}
    }
    

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

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

相關文章

2025 cv2.imwrite存儲帶有中文路徑

一、前言 cv使用的更多一些,不過cv讀取和寫入帶有中文路徑的圖片會報錯有寫出亂碼。 以下代碼是從視頻中獲取第2幀保存在中文文件夾下的實例: cap cv2.VideoCapture("***.mp4")cap.set(cv2.CAP_PROP_POS_FRAMES, 2)ret, framecap.read()cv2…

在 CentOS 上,常用幾種方法來確保 Python 腳本在斷開終端后繼續運行

在 CentOS 上,你可以使用以下幾種方法來確保 Python 腳本在斷開終端后繼續運行: 1. 使用 nohup 命令 nohup 命令可以讓進程在終端關閉后繼續運行。 nohup python main.py > output.log 2>&1 &nohup:忽略掛斷信號&#xff0c…

blazemeter工具使用--用于自動生成jmeter腳本并進行性能測試

1、安裝blazemeter(網上有很多詳情的教程) 2、開始錄制:設置號你的文件名稱后開始錄制 3、錄制完成后保存為jmeter(jmx)文件 4、在jmeter中打開文件 5、添加一個后置處理器:查看結果樹,后運行看看能否成功&#xf…

6-langchang多模態輸入和自定義輸出

6-langchang多模態輸入和自定義輸出 多模態數據輸入urlbase64url list工具調用自定義輸出: JSON, XML, YAML如何解析 JSON 輸出json如何解析xmlYAML解析器多模態數據輸入 這里我們演示如何將多模態輸入直接傳遞給模型。我們目前期望所有輸入都以與OpenAI 期望的格式相同的格式…

【C#實現手寫Ollama服務交互,實現本地模型對話】

前言 C#手寫Ollama服務交互,實現本地模型對話 最近使用C#調用OllamaSharpe庫實現Ollama本地對話,然后思考著能否自己實現這個功能。經過一番查找,和查看OllamaSharpe源碼發現確實可以。其實就是開啟Ollama服務后,發送HTTP請求&a…

【C#學習筆記02】基本元素與數據類型

引言 深入了解C語言的基本元素、計算機存儲器結構、常量與變量的概念以及數據類型。這些內容是C語言編程的基礎,掌握它們對于編寫高效、可靠的嵌入式程序至關重要。 1.C語言的基本元素 ?編程語言的發展離不開自然語言,所以編程語言的語法和詞匯也是由…

ESP8266TCP客戶端(單連接TCP Client)

單連接TCP Client 電腦作為服務器,8266作為客戶端 1.配置WiFi模式 ATCWMODE3 //softAPstation mode 相應:ok 2.連接路由器 ATCWJAP“SSID”,“password” //SSID就是wifi的名字, password WIFI密碼 響應&#xff…

洛谷 P2234:[HNOI2002] 營業額統計 ← STL set

【題目來源】 https://www.luogu.com.cn/problem/P2234 【題目描述】 Tiger 最近被公司升任為營業部經理,他上任后接受公司交給的第一項任務便是統計并分析公司成立以來的營業情況。 Tiger 拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析…

VSCode 2025最新前端開發必備插件推薦匯總(提效指南)

🌟前言: 如果你是一名前端開發工程師,合適的開發工具能大大提高工作效率。Visual Studio Code (VSCode) 憑借其輕量級、高擴展性的特點,已成為眾多前端開發者在win系電腦的首選IDE。 名人說:博觀而約取,厚積而薄發。—…

Java學習--Redis

官網:https://redis.io 中文網:Redis中文網 Redis安裝包分為 Windows 版和 Linux 版: Windows版下載地址:Releases microsoftarchive/redis GitHub Linux版下載地址: Index of /releases/ 一、Redis簡介 Redis是…

matlab慕課學習3.2+3.3

于20250310 3.2用if語句實現選擇結構 3.2.1什么是選擇結構 用if 語句和switch語句可實現選擇結構 3.2.2單分支if語句 if 條件語句組 %可以是一條也可是多條end 當條件為標量,非0表成立,0表示不成立。 當條件為矩陣時,矩陣非空&#xff…

JavaScript性能優化:DOM操作優化實戰

JavaScript性能優化:DOM操作優化實戰 一 重排與重繪的代價 問題場景 用戶點擊按鈕后,需要動態生成一個包含10,000個選項的下拉列表,但界面出現長達5秒的凍結。 錯誤代碼示例 function createList() {const ul document.getElementById(…

【Java學習】包裝類

面向對象系列九 包裝類變量 一、裝箱 1.實例化包裝對象 2.靜態緩存池 3.寫法 二、拆箱 包裝類變量 每個基本數據類型都有對應的基本類型的包裝類變量,將基本數據類型通過對應的包裝類對象載入著進入到類與對象面向對象體系 一、裝箱 Integer.valueOf(int) —…

【第22節】C++設計模式(行為模式)-Iterator(迭代器)模式

一、問題背景 Iterator 模式是設計模式中最為常見和實用的模式之一。它的核心思想是將對聚合對象的遍歷操作封裝到一個獨立的類中,從而避免暴露聚合對象的內部表示。通過 Iterator 模式,我們可以實現對聚合對象的統一遍歷接口,而不需要關心聚…

02C#基本結構篇(D4_注釋-訪問修飾符-標識符-關鍵字-運算符-流程控制語句)

目錄 一、注釋 1. 單行注釋 2. 多行注釋 3. XML文檔注釋 4. 使用建議和最佳實踐: 二、訪問修飾符 1. public 2. private 3. protected 4. internal 5. protected internal 或 protected and internal 6. private protected 或 private and protected 7.…

【CXX】6.2 str — rust::Str

Rust::Str 公共 API // rust/cxx.hclass Str final { public:Str() noexcept;Str(const Str &) noexcept;Str(const String &) noexcept;// 如果輸入不是 UTF-8,拋出 std::invalid_argument 異常。Str(const std::string &);Str(const char *);Str(con…

基于windows的MySQL安裝(2025最新,小白可用)

目錄 一,下載官網地址(及版本選擇): 二,以安裝程序的方式安裝MySQL 1,安裝過程 2,用客戶端使用MySQL 3,配置環境變量在windows命令行界面使用mysql 下次開機后手動啟用服務 三…

Jenkins實現自動化構建與部署:上手攻略

一、持續集成與Jenkins核心價值 1.1 為什么需要自動化構建? 在現代化軟件開發中,團隊每日面臨以下挑戰: 高頻代碼提交:平均每個開發者每天提交5-10次代碼。多環境部署:開發、測試、預發布、生產環境需頻繁同步。復雜…

4個 Vue 路由實現的過程

大家好,我是大澈!一個喜歡結交朋友、喜歡編程技術和科技前沿的老程序員👨🏻?💻,關注我,科技未來或許我能幫到你! Vue 路由相信朋友們用的都很熟了,但是你知道 Vue 路由…

數學之快速冪-數的冪次

題目描述 給定三個正整數 N,M,P,求 輸入描述 第 1 行為一個整數 T,表示測試數據數量。 接下來的 T 行每行包含三個正整數 N,M,P。 輸出描述 輸出共 T 行,每行包含一個整數,表示答案。 輸入輸出樣例 示例 1 輸入 3 2 3 7 4…