在Java項目中,引入【全局異常處理器】

目錄

一.為什么引入全局異常處理器(目前項目碰到了什么問題)?

1.問題描述

2.與預期的差別

3.解決方案

二.解決上述問題

1.定義【業務異常類】

2.在serviceImpl層,手動拋出【違反唯一性約束】這個異常

3.定義【全局異常處理器】

4.修改userController層的代碼

三.展示效果

四.重點理解【全局異常處理器】的優點

1.項目引入了全局異常處理器以后,就不用在controller里面判斷insert語句的影響行數了

2.引入全局異常處理器后,可以使得請求異常時的響應數據可讀性非常強。

3.引入全局異常處理器后,后端產生異常時不會在控制臺輸出大片異常信息。

4.總結大致流程

結語


一.為什么引入全局異常處理器(目前項目碰到了什么問題)?

1.問題描述

????????我們在添加一個系統用戶時,要求用戶名(username字段)必須是唯一的,即不能重復。如果重復了,那么insert語句不會返回0(之前我們是這么認為的),而是直接令后端報錯。如下:

使用apiFox添加一個系統用戶:?

去后端控制臺查看報錯:

可見此時是因為違反了user表的username字段的唯一約束(unique)。

2.與預期的差別

????????我的初衷是:添加一個系統用戶時,如果添加成功,就返回影響行數1;如果添加失敗,就返回影響行數0。?

? ? ? ? 這樣就能在controller層中,根據影響行數來決定返回給前端什么響應體。

? ? ? ? 如下:

? ? ? ? userServiceImpl層:

? ? ? ? userController層:?

? ? ? ? 重點來了:上述所預想的一切,都不成立。因為當insert語句執行失敗時,根本就不返回影響行數0,而是直接使后端崩塌,響應給前端的數據也是可讀性極差。?

3.解決方案

? ? ? ? ?此時就需要定義【業務異常】和【全局異常處理器】來包容上述的錯誤。

????????就好比insert語句執行失敗時,扔出一顆炸彈,但沒關系,我們直接使用全局異常處理器,來吸收即可。

二.解決上述問題

1.定義【業務異常類】

? ? ? ? 該業務異常類,就包括我們上面提到的違反了唯一約束的這種異常。

? ? ? ? 而且以后我們項目中出現了其他的業務異常,也可以用該類來接收。

? ? ? ? 第一步:創建Exception目錄,用來存放自定義異常類和全局異常處理器。

? ? ? ? 第二步:在?Exception目錄下,創建【業務異常類】。

2.在serviceImpl層,手動拋出【違反唯一性約束】這個異常

3.定義【全局異常處理器】

全局異常處理器,得益于spring。我們可以在全局異常處理器中,進行捕獲某種異常并進行對應操作。從而來優化響應數據、防止后端崩塌(其實是美化后端控制臺)。

在exception目錄下,創建全局異常處理器。

package com.neuedu.his.Exception;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.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.Map;@ControllerAdvice//該注解可以自動捕獲我們剛才拋出的異常
public class GlobalExceptionHandler {//處理自定義異常:【業務異常BusinessException】@ExceptionHandler(BusinessException.class)//專門處理業務異常類BusinessException@ResponseBody//表示我們要將該方法的返回值轉為JSON格式返回給前端public ResponseEntity<Map<String, Object>> handleBusinessException(BusinessException e){Map<String, Object> response = new HashMap<>();response.put("code", 409);response.put("message", e.getMessage());return new ResponseEntity<>(response, HttpStatus.CONFLICT);}//處理其他異常@ExceptionHandler(Exception.class)@ResponseBodypublic ResponseEntity<Map<String, Object>> handleException(Exception e){Map<String, Object> response = new HashMap<>();response.put("code", 500);response.put("message", "系統內部錯誤,請稍后重試");return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR);}
}

4.修改userController層的代碼

三.展示效果

成功的情況:

異常情況1:違反了數據庫字段唯一性(業務異常)

異常情況2:其他異常

四.重點理解【全局異常處理器】的優點

1.項目引入了全局異常處理器以后,就不用在controller里面判斷insert語句的影響行數了

????????如下:我們在userController層中,沒有判斷insert語句的影響行數的情況下,就返回了成功信息。

? ? ? ? 這是因為,代碼能走到這里,說明userService沒有拋出任何異常,也就間接說明了我們的添加用戶業務沒有任何問題,因此結果肯定是添加成功,因此就可以直接返回成功信息。

? ? ? ? 因此以后我們項目引入全局異常處理器以后,在controller層可以直接調用完service層后直接返回成功信息。

2.引入全局異常處理器后,可以使得請求異常時的響應數據可讀性非常強。

引入全局異常處理器之前,請求異常時的響應信息:

引入全局異常處理器之后,請求異常時的響應信息:

如下圖:這兩種異常請求下的響應數據,可讀性都十分強,比原來的大坨字母強多了。

3.引入全局異常處理器后,后端產生異常時不會在控制臺輸出大片異常信息。

引入全局異常處理器之前,產生異常時控制臺的樣貌:

引入全局異常處理器之后,產生異常時控制臺的樣貌:

4.總結大致流程

①定義【自定義異常類】和【全局異常處理器】

②手動在serviceIml層拋出異常

③【全局異常處理器】自動捕獲上面拋出的異常,并進行響應消息處理。

④如果serviceImpl層沒拋出異常,則響應消息由controller層返回;

? ? 如果serviceImpl層拋出了一場,則響應消息由【全局異常處理器】的某個方法返回。

結語

以上就是在項目中,引入【全局異常處理器】的原因、做法、優點。

喜歡本篇文章的話,可以留個免費的關注呦~~

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

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

相關文章

newspaper公共庫獲取每個 URL 對應的新聞內容,并將提取的新聞正文保存到一個文件中

示例代碼&#xff1a; from newspaper import Article from newspaper import Config import json from tqdm import tqdm import os import requestswith open(datasource/api/news_api.json, r) as file:data json.load(file)print(len(data)) save_path datasource/sourc…

前端核心知識:Vue 3 編程的 10 個實用技巧

文章目錄 1. **使用 ref 和 reactive 管理響應式數據**原理解析代碼示例注意事項 2. **組合式 API&#xff08;Composition API&#xff09;**原理解析代碼示例優勢 3. **使用 watch 和 watchEffect 監聽數據變化**原理解析代碼示例注意事項 4. **使用 provide 和 inject 實現跨…

【Web API系列】XMLHttpRequest API和Fetch API深入理解與應用指南

前言 在現代Web開發中&#xff0c;客戶端與服務器之間的異步通信是構建動態應用的核心能力。無論是傳統的AJAX技術&#xff08;基于XMLHttpRequest&#xff09;還是現代的Fetch API&#xff0c;它們都為實現這一目標提供了關鍵支持。本文將從底層原理、核心功能、代碼實踐到實…

[特殊字符] Spring Boot 日志系統入門博客大綱(適合初學者)

一、前言 &#x1f4cc; 為什么日志在項目中如此重要&#xff1f; 在開發和維護一個后端系統時&#xff0c;日志就像程序運行時的“黑匣子”&#xff0c;幫我們記錄系統的各種行為和異常。一份良好的日志&#xff0c;不僅能幫助我們快速定位問題&#xff0c;還能在以下場景中…

IP協議之IP,ICMP協議

1.因特網中的主要協議是TCP/IP&#xff0c;Interneet協議也叫TCP/IP協議簇 2.ip地址用點分十進制表示&#xff0c;由32位的二進制表示&#xff0c;兩部分組成&#xff1a;網絡標識主機標識 3.IP地址分類; A:0.0.0.0-127.255.255.255 B&#xff1a;128.0.0.0-191.255.255.25…

GPIO_ReadInputData和GPIO_ReadInputDataBit區別

目錄 1、GPIO_ReadInputData: 2、GPIO_ReadInputDataBit: 總結 GPIO_ReadInputData 和 GPIO_ReadInputDataBit 是兩個函數&#xff0c;通常用于讀取微控制器GPIO&#xff08;通用輸入輸出&#xff09;引腳的輸入狀態&#xff0c;特別是在STM32系列微控制器中。它們之間的主要…

洛古B4158 [BCSP-X 2024 12 月小學高年級組] 質數補全(線性篩/dfs)

B4158 [BCSP-X 2024 12 月小學高年級組] 質數補全 - 洛谷 思路1:線性篩,字符串匹配,枚舉 質數篩選 要解決這個問題&#xff0c;首先得找出指定范圍內&#xff08;這里是 1 到 10000000&#xff09;的所有質數。常用的質數篩選算法有埃拉托斯特尼篩法&#xff08;埃氏篩&#…

一周學會Pandas2 Python數據處理與分析-Pandas2讀取Excel

鋒哥原創的Pandas2 Python數據處理與分析 視頻教程&#xff1a; 2025版 Pandas2 Python數據處理與分析 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili Excel格式文件是辦公使用和處理最多的文件格式之一&#xff0c;相比CSV文件&#xff0c;Excel是有樣式的。Pandas2提…

NVIDIA H100 vs A100:新一代GPU架構性能對比分析

一、核心架構演進對比 ?Ampere架構&#xff08;A100&#xff09;?采用臺積電7nm工藝&#xff0c;集成540億晶體管&#xff0c;配備6,912個CUDA核心和432個第三代Tensor Core&#xff0c;支持FP16、TF32和INT8精度計算。其顯存子系統采用HBM2e技術&#xff0c;80GB版本帶寬可…

保護PCBA的不同方法:噴三防漆 vs 鍍膜

PCBA&#xff08;印刷電路板組件&#xff09;的防護工藝中&#xff0c;噴三防漆和鍍膜&#xff08;如Parylene氣相沉積&#xff09;是兩種常見技 術。它們在防護目的上類似&#xff0c;但在具體實現方式和應用場景上有顯著差異。以下從外觀、工藝、性 能、物理性質和成本五個…

VitePress 項目部署 cloudflare page 提示 npm run build 錯誤

構建的錯誤信息如下&#xff1a; 09:52:57.975 ? YN0000: Done with warnings in 3s 120ms 09:52:58.072 Executing user command: npm run build 09:52:58.817 npm ERR! Missing script: "build" 09:52:58.818 npm ERR! 09:52:58.818 npm ERR! To see a list of …

C++學習之ORACLE③

1.集合運算符 查詢部門號是10和20的員工信息&#xff1a; &#xff1f;思考有幾種方式解決該問題 &#xff1f; SQL> select * from emp where deptno in(10, 20) SQL> select * from emp where deptno10 or deptno20 集合運算&#xff1a; Select * from emp …

人工智能之數學基礎:復矩陣

本文重點 復矩陣是線性代數中以復數為元素的矩陣,是實矩陣在復數域上的自然推廣。與實矩陣相比,復矩陣在數學性質、運算規則和應用場景上具有獨特性,尤其在量子力學、信號處理、控制理論等領域發揮關鍵作用。 復矩陣的定義與表示 定義:復矩陣指的是元素含有復數的矩陣。…

華清遠見成都中心嵌入式學習總結

一、Linux 基礎入門 課程首先介紹了 Linux 系統的六大特性&#xff0c;包括開源、免費、可裁剪等核心優勢。重點講解了文件系統結構&#xff0c;強調根目錄&#xff08;/&#xff09;作為唯一入口的樹狀結構。通過實操學習了 pwd、ls、cd 等基礎命令&#xff0c;掌握了絕對路徑…

linux安裝ollama

倆種方式都可 一、linux通過docker安裝ollama鏡像 1.下載安裝ollama鏡像 # 安裝 Docker sudo yum install docker sudo systemctl start docker#docker查看所有容器 docker ps -a # 查看所有容器# docker查看指定容器 docker ps -a |grep ollama# 創建模型存儲目錄&#xff…

Redis 學習目標

&#x1f3af; Redis 學習目標&#xff08;開發者視角&#xff09; ? 一、學習完成后能掌握的核心能力&#xff1a; 分類具體內容&#x1f4e6; 基礎能力熟練掌握 Redis 五大數據結構&#xff08;String、List、Hash、Set、ZSet&#xff09;&#xff0c;會用也會選對場景&am…

gerrit配置及使用git-lfs

gerrit服務器端配置 下載git-lfs插件 登錄Dashboard [Jenkins] (gerritforge.com)&#xff0c;下載對應版本的插件 配置gerrit 將下載的lfs.jar插件放到${GERRIT_SITE}/plugins/下面為所有倉庫啟用git-lfs 此步驟需要修改 All-projects 倉庫配置&#xff0c;步驟如下 1、克隆倉…

深入理解 Linux PATH 環境變量:配置與優化!!!

深入理解 Linux PATH 環境變量&#xff1a;配置與優化 &#x1f680; 歡迎來到 Linux 環境變量的奇妙世界&#xff01;今天我們來聊聊那個讓命令行如魚得水的幕后英雄——PATH 環境變量&#xff01;&#x1f60e; 通過這篇博客&#xff0c;你將學會如何配置它、優化它&#xff…

如何在AMD MI300X 服務器上部署 DeepSeek R1模型?

DeepSeek-R1憑借其深度推理能力備受關注&#xff0c;在語言模型性能基準測試中可與頂級閉源模型匹敵。 AMD Instinct MI300X GPU可在單節點上高效運行新發布的DeepSeek-R1和V3模型。 用戶通過SGLang優化&#xff0c;將MI300X的性能提升至初始版本的4倍&#xff0c;且更多優化將…

簡化DB操作:Golang 通用倉庫模式

介紹 本代碼包提供一個用于數據庫操作的通用倉庫 (GenericRepository)&#xff0c;利用 Golang 和 GORM (Go ORM) 實現。該倉庫設計用于簡化數據庫的 CRUD (創建、讀取、更新、刪除) 操作&#xff0c;支持批處理、沖突處理、分頁查詢等高級功能。 主要功能 創建記錄 (Create…