【Spring Boot】實現全局異常處理

1.定義基礎異常接口類

/*** @description: 服務接口類* @author: MrVK* @date: 2021/4/19 21:39*/
public interface BaseErrorInfoInterface {/***  錯誤碼* @return*/String getResultCode();/*** 錯誤描述* @return*/String getResultMsg();
}

2.定義錯誤處理枚舉類

/*** @description: 異常處理枚舉類* @author: MrVK* @date: 2021/4/19 21:41* @version: v1.0*/
public enum ExceptionEnum implements BaseErrorInfoInterface{// 數據操作錯誤定義SUCCESS("2000", "成功!"),BODY_NOT_MATCH("4000","請求的數據格式不符!"),SIGNATURE_NOT_MATCH("4001","請求的數字簽名不匹配!"),NOT_FOUND("4004", "未找到該資源!"),INTERNAL_SERVER_ERROR("5000", "服務器內部錯誤!"),SERVER_BUSY("5003","服務器正忙,請稍后再試!");/*** 錯誤碼*/private final String resultCode;/*** 錯誤描述*/private final String resultMsg;ExceptionEnum(String resultCode, String resultMsg) {this.resultCode = resultCode;this.resultMsg = resultMsg;}@Overridepublic String getResultCode() {return resultCode;}@Overridepublic String getResultMsg() {return resultMsg;}
}

3.自定義異常類

/*** @description: 自定義異常類* @author: MrVK* @date: 2021/4/19 21:44* @version: v1.0*/
public class BizException extends RuntimeException{private static final long serialVersionUID = 1L;/*** 錯誤碼*/protected String errorCode;/*** 錯誤信息*/protected String errorMsg;public BizException() {super();}public BizException(BaseErrorInfoInterface errorInfoInterface) {super(errorInfoInterface.getResultCode());this.errorCode = errorInfoInterface.getResultCode();this.errorMsg = errorInfoInterface.getResultMsg();}public BizException(BaseErrorInfoInterface errorInfoInterface, Throwable cause) {super(errorInfoInterface.getResultCode(), cause);this.errorCode = errorInfoInterface.getResultCode();this.errorMsg = errorInfoInterface.getResultMsg();}public BizException(String errorMsg) {super(errorMsg);this.errorMsg = errorMsg;}public BizException(String errorCode, String errorMsg) {super(errorCode);this.errorCode = errorCode;this.errorMsg = errorMsg;}public BizException(String errorCode, String errorMsg, Throwable cause) {super(errorCode, cause);this.errorCode = errorCode;this.errorMsg = errorMsg;}public String getErrorCode() {return errorCode;}public void setErrorCode(String errorCode) {this.errorCode = errorCode;}public String getErrorMsg() {return errorMsg;}public void setErrorMsg(String errorMsg) {this.errorMsg = errorMsg;}@Overridepublic Throwable fillInStackTrace() {return this;}
}

4.自定義響應體類

/*** @description: 自定義數據傳輸* @author: MrVK* @date: 2021/4/19 21:47* @version: v1.0*/
public class ResultResponse {/*** 響應代碼*/private String code;/*** 響應消息*/private String message;/*** 響應結果*/private Object result;public ResultResponse() {}public ResultResponse(BaseErrorInfoInterface errorInfo) {this.code = errorInfo.getResultCode();this.message = errorInfo.getResultMsg();}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Object getResult() {return result;}public void setResult(Object result) {this.result = result;}/*** 成功** @return*/public static ResultResponse success() {return success(null);}/*** 成功* @param data* @return*/public static ResultResponse success(Object data) {ResultResponse rb = new ResultResponse();rb.setCode(ExceptionEnum.SUCCESS.getResultCode());rb.setMessage(ExceptionEnum.SUCCESS.getResultMsg());rb.setResult(data);return rb;}/*** 失敗*/public static ResultResponse error(BaseErrorInfoInterface errorInfo) {ResultResponse rb = new ResultResponse();rb.setCode(errorInfo.getResultCode());rb.setMessage(errorInfo.getResultMsg());rb.setResult(null);return rb;}/*** 失敗*/public static ResultResponse error(String code, String message) {ResultResponse rb = new ResultResponse();rb.setCode(code);rb.setMessage(message);rb.setResult(null);return rb;}/*** 失敗*/public static ResultResponse error( String message) {ResultResponse rb = new ResultResponse();rb.setCode("-1");rb.setMessage(message);rb.setResult(null);return rb;}@Overridepublic String toString() {return JSONObject.toJSONString(this);}}

5.自定義全局異常處理

/*** @description: 自定義異常處理* @author: MrVK* @date: 2021/4/19 21:51* @version: v1.0*/
@ControllerAdvice
public class GlobalExceptionHandler {private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);/*** 處理自定義的業務異常* @param req* @param e* @return*/@ExceptionHandler(value = BizException.class)@ResponseBodypublic ResultResponse bizExceptionHandler(HttpServletRequest req, BizException e){logger.error("發生業務異常!原因是:{}",e.getErrorMsg());return ResultResponse.error(e.getErrorCode(),e.getErrorMsg());}/*** 處理空指針的異常* @param req* @param e* @return*/@ExceptionHandler(value =NullPointerException.class)@ResponseBodypublic ResultResponse exceptionHandler(HttpServletRequest req, NullPointerException e){logger.error("發生空指針異常!原因是:",e);return ResultResponse.error(ExceptionEnum.BODY_NOT_MATCH);}/*** 處理其他異常* @param req* @param e* @return*/@ExceptionHandler(value =Exception.class)@ResponseBodypublic ResultResponse exceptionHandler(HttpServletRequest req, Exception e){logger.error("未知異常!原因是:",e);return ResultResponse.error(ExceptionEnum.INTERNAL_SERVER_ERROR);}
}

6.測試代碼

@PostMapping("/add")
public boolean add(@RequestBody User user) {//如果姓名為空就手動拋出一個自定義的異常!if(user.getName()==null){throw  new BizException("-1","用戶姓名不能為空!");}return true;
}@PutMapping("/update")
public boolean update(@RequestBody User user) {//這里故意造成一個空指針的異常,并且不進行處理String str = null;str.equals("111");return true;
}@DeleteMapping("/delete")
public boolean delete(@RequestBody User user)  {//這里故意造成一個異常,并且不進行處理Integer.parseInt("abc123");return true;
}@GetMapping("/error")
@ExceptionHandler(value = NumberFormatException.class)
@ResponseBody
public ResultResponse exceptionHandler(HttpServletRequest req, NumberFormatException e){logger.error("發生類型轉換異常!原因是:",e);return ResultResponse.error(ExceptionEnum.PARAMS_NOT_CONVERT);
}

7.測試結果

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

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

相關文章

小伙伴詢問AI該怎么學習?本人的一點總結,以思維導圖呈現

如有需要思維導圖的在后臺請留郵箱,相關知識結構目錄 部分導圖

nn.Linear() 使用提醒

原本以為它是和nn.Conv2d()一樣,就看第二個維度的數值,今天才知道,它是只看最后一個維度的數值!!! 例子1 Descripttion: Result: Author: Philo Date: 2024-02-27 14:33:50 LastEditors: Philo LastEditT…

git使用merge命令把dev分支的mian.js文件和src下面的vuex文件夾以及config文件夾單獨合并到master分支上

使用 git merge 命令來單獨合并特定文件或文件夾到另一個分支通常不是最直接的方法,因為 merge 命令是用來合并兩個分支的所有更改的。然而,你可以通過 git cherry-pick 命令或者通過創建臨時補丁(patch)來實現這一點。 下面是一個…

秒殺的時候怎么使用Redis?

商品信息存儲:在Redis中存儲秒殺商品的庫存信息。可以使用Redis的Hash數據類型,將商品ID作為字段,庫存數量作為值存儲在Hash中。例如,HSET seckill_goods stock_1 100表示商品ID為stock_1的商品庫存數量為100。 秒殺訂單存儲&…

如何使用“Ubuntu 20.04桌面版,安裝MariaDB數據庫“?win10系統?

1、更新軟件包 sudo apt update 2、 安裝MariaDB服務器和客戶端 sudo apt install mariadb-server mariadb-client 3、 查看MeriaDB是否運行 service mysql status :q"退回命令行狀態 4、 設置MariaDB root用戶的密碼 sudo mysql_secure_installation 5、 MariaD…

斐波那契數列模型----三步問題

面試題 08.01. 三步問題 - 力扣(LeetCode) 1、狀態表示: 題目要求:上到n階臺階,有多少種方法。那么n逐漸簡化,上1階臺階有多少種方法;上2階臺階有多少種方法……直到上n階臺階有多少種方法。 …

c++ [[nodiscard]]關鍵字詳解

如果一個函數聲明了[[nodiscard]],則該函數的返回值不能沒有承接,如果沒有承接,就會編譯報warning [[nodiscard]]是c17新特性,但本地用c11標準編譯也能編譯過,尚不清楚原因,c20加入了warning后的額外文字描…

代碼隨想錄第45天|● 70. 爬樓梯 (進階) ● 322. 零錢兌換 ● 279.完全平方數

文章目錄 ● 70. 爬樓梯 (進階)思路:- 排列 先value后weight代碼: ● 322. 零錢兌換思路:代碼 ● 279.完全平方數思路:代碼 ● 70. 爬樓梯 (進階) 思路:- 排列 先value后…

如何提升計算機性能

04 穿越功耗墻,我們該從哪些方面提升“性能”? 上一講,在講 CPU 的性能時,我們提到了這樣一個公式: 程序的 CPU 執行時間 指令數CPIClock Cycle Time 這么來看,如果要提升計算機的性能,我們可以…

zookeeper框架

事務ID Znode的創建刪除,更改內容等都是作為zookeeper的事務進行執行的。 對于每一個事務請求,zookeeper都會為其分配一個全局唯一的事務ID,從ID可以識別出事務的全局順序。 節點特性 czxid:create zxid,數據節點創建時的事務ID mzxid&…

基于ZYNQ的PCIE高速數據采集卡的設計(一)

作為信息處理的第一步,數據采集的作用越來越重要。目前,數據采集已經在航 空、民用、軍事、醫療等領域得到廣泛應用。隨著相關技術的不斷發展,信號頻率越 來高,帶寬越來越大,使得數據采集技術逐漸向高速大數據的方向…

【python】優化docker鏡像體積

背景 測試腳本的最終所構成的鏡像體積偏大,項目提出整改 實現思路 1.測試基礎鏡像,更換為更小的 參見:python 多階段構建docker鏡像,有效減少鏡像大小 - 知乎 2.去掉實際未使用的依賴庫

幻獸帕魯專用服務器搭建之Linux部署配置教程

大家好我是飛飛,上一期我分享了Windows系統的幻獸帕魯服務器搭建教程。因為幻獸帕魯這游戲對服務器的配置有一定的要求,很多小伙伴就尋思用Linux系統搭建占用會不會小一點?有計算機基礎的小伙伴都知道Linux系統和Windows系統相比,…

【Linux】實時查看服務器信息

查看服務器CPU使用率 使用命令mpstat 1。這里的1表示每隔1秒更新一次CPU使用率。如果系統未安裝mpstat,可以通過安裝sysstat包來獲取它。 在基于Debian的系統(如Ubuntu)上,使用命令: sudo apt-get update sudo apt-…

JavaScript 數據類型詳解的教程

在JavaScript中,數據類型是非常重要的概念,了解數據類型有助于我們更好地操作數據以及編寫高效的代碼。本教程將詳細介紹JavaScript中的各種數據類型,包括基本數據類型和復雜數據類型。 基本數據類型 1. 數值(Number) 在JavaScript中&…

考研復試類比社團招新,無所謂“公平”,導師選誰都是他的權力

這篇文章是抖音和b站上上傳的同名視頻的原文稿件,感興趣的csdn用戶可以關注我的抖音和b站賬號(GeekPower極客力量)。同時這篇文章也為視頻觀眾提供方便,可以更加冷靜地分析和思考。文章同時在知乎發表。 我考研一戰的時候計算機考…

MySQL 主從復制配置指南

MySQL 主從復制配置指南 MySQL主從復制允許數據從一個MySQL數據庫服務器(主服務器)復制到一個或多個MySQL數據庫服務器(從服務器)。這是一種常用的數據冗余和備份方法,也可以用于負載均衡。 前提條件 主服務器和從服…

【詳識JAVA語言】面向對象程序三大特性之一:封裝

封裝的概念 面向對象程序三大特性:封裝、繼承、多態。而類和對象階段,主要研究的就是封裝特性。何為封裝呢?簡單來說 就是套殼屏蔽細節。 比如:對于電腦這樣一個復雜的設備,提供給用戶的就只是:開關機、通…

飛槳模型轉ONNX模型教程

文章目錄 飛槳模型轉ONNX模型教程1. ONNX簡介2. Paddle2ONNX安裝3. 獲取Paddle2ONNX模型庫4. 飛槳轉ONNX教程4.1 飛槳訓練模型導出為ONNX模型4.2 飛槳部署模型轉為ONNX模型4.3 驗證ONNX模型4.4 使用ONNX模型進行推理 5. 注意事項 飛槳模型轉ONNX模型教程 1. ONNX簡介 ONNX是一…

管理系統提升:列表頁構成要素,拒絕千篇一律

大家伙,我是大千UI工場,專注UI知識案例分享和接單,本期帶來B端系統列表頁的分享,歡迎大家關注、互動交流。 一、什么是列表頁 管理系統列表頁是指管理系統中用于展示和管理數據的頁面,通常以表格或列表的形式呈現。列…