Spring MVC中異常處理

1.全局異常處理

1.1什么是全局異常處理器

全局異常處理器是SpringMVC框架中的一種異常處理機制,用于統一處理由控制器拋出的異常。

全局異常處理器可以幫助我們捕獲和處理控制器中的異常,并且根據不同的異常類型進行不同的處理操作,從而保障應用的健壯性和穩定性。

當然,SpringMVC中有內置的異常處理對象,但是呈現的結果對于用戶端不友好,所以實際項目我們一般會使用全局異常處理器處理異常。

如果僅僅在項目中寫下以下代碼,會導致異常處理呈現的結果用戶端難以理解。

@RestController
@RequestMapping("/v1/tests/")
public class TestController {@GetMapping("test")public JsonResult test(Integer id) {if (id < 0) {throw new IllegalArgumentException("id不能小于0");}return new JsonResult(200,"成功訪問");}
}

如果我們能做到像一些企業級的異常應對措施,比如bilibili

當輸入網址https://www.bilibili.com/id=111
這個地址根本不存在,結果返回一個“找不到頁面”的頁面。

這種處理效果是 前端+后端共同開發的效果,采用后端捕獲異常 + 前端自定義錯誤頁面渲染 的組合處理方式

前后端分離(REST 風格)

  • 用全局異常處理器統一返回結構化 JSON

  • 由前端(如 Vue、React)判斷 status 或 code,顯示漂亮的提示頁面

{ "code": 404, "msg": "資源不存在", "data": null }

然后前端根據 code == 404 顯示“找不到頁面”的提示比如嗶哩嗶哩的效果。

1.2 全局異常處理器的配置


Spring MVC中的全局異常處理器可以通過以下方式進行配置:

1. 創建 exception.GlobalExceptionHandler 類,并添加異常處理方法;
使用 @ControllerAdvice 注解 + ResponseBody注解 或者 @RestControllerAdvice 注解標注該類;


2. 在異常處理方法上添加 @ExceptionHandler 注解,用于指定控制器中需要處理的異常類型。

@ControllerAdvice?

@ControllerAdvice 本質上是一個帶有 @Component 的注解,Spring 啟動時會將它的類掃描進容器中。

它內部利用 AOP 和 HandlerExceptionResolver 原理,在 Controller 執行過程中如果拋出了異常,就會查找有沒有全局的異常處理器處理它。

@ExceptionHandler

@Exception注解 指定:這個方法能處理哪種異常類型

它的參數是異常對象(如 IllegalArgumentException e),Spring 會自動注入

你可以根據異常信息生成 JSON 響應、記錄日志等

我們來進行優化上面的代碼,在TestController基礎上加上GlobalHandlerException類

@RestController
@RequestMapping("/v1/tests/")
public class TestController {@GetMapping("test")public JsonResult test(Integer id) {if (id < 0) {throw new IllegalArgumentException("id不能小于0");}return new JsonResult(200,"成功訪問");}
}@Slf4j
@RestControllerAdvice
public class GlobalHandlerException {@ExceptionHandlerpublic String doHandlerIllegalArgumentExceptionException(IllegalArgumentException ex){log.error("ex : " + ex);return ex.getMessage();}
}

此時雖然沒有嗶哩嗶哩網址那么華麗,但是總歸是可以讓用戶清晰的知道不能傳遞id < 0這個限制了。

1.3 使用流程


1)創建全局異常處理器類


工程目錄下創建 exception.GlobalExceptionHandler
@ControllerAdvice 注解


定義全局異常處理器,處理Controller中拋出的異常。
@RestControllerAdvice 注解
復合注解,是 @ControllerAdvice 注解和 @ResponseBody 注解的組合;
用于捕獲Controller中拋出的異常并對異常進行統一的處理,還可以對返回的數據進行處理。


2)創建異常處理方法


在異常處理方法上添加 @ExceptionHandler 注解
@ExceptionHandler 注解
用于捕獲Controller處理請求時拋出的異常,并進行統一的處理。
示例

/**ex.getMessage()方法:用于捕獲異常信息
*/
@ExceptionHandler
public JsonResult doHandleRuntimeException(RuntimeException ex){log.error("error is " + ex.getMessage());return new JsonResult(StatusCode.OPERATION_FAILED,ex.getMessage());
}


1.4 全局異常處理器示例


1)微博詳情頁異常拋出

public JsonResult selectById(int id){if(id < 0) {throw new IllegalArgumentException("id值無效");}... ...
}


2)全局異常處理


exception.GlobalExceptionHandler 類


package cn.tedu.weibo.exception;import cn.tedu.weibo.common.response.JsonResult;
import cn.tedu.weibo.common.response.StatusCode;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;/*** RestControllerAdvice 是復合注解,描述的類型為一個全局異常處理對象類型,* 等價于:@ControllerAdvice+@ResponseBody* 當某個Controller方法中出現了異常,系統底層就會查找有沒有定義全局異常處理對象。* 這個全局異常處理對象中有沒有定義對應的異常處理方法,假如有就調用此方法處理異常。*/@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {/***  @ExceptionHandler 描述的方法為一個異常處理方法,在此注解內部可以定義具體的異常處理*  類型(例如RuntimeException),此注解描述的方法需要定義一個異常類型的形式參數,*  通過這個參數接收具體的異常對象(也可以接收其異常類型對應的子類類型的異常)。*/@ExceptionHandlerpublic JsonResult doHandleRuntimeException(RuntimeException ex){log.error("error is " + ex.getMessage());return new JsonResult(StatusCode.OPERATION_FAILED,ex.getMessage());}/*** 假如用全局異常處理對象處理Controller類中出現的異常,全局異常處理對象會優先查找與Controller* 中相匹配的異常處理方法,假如沒有,會查找對應異常的父類異常處理方法。*/@ExceptionHandlerpublic JsonResult doHandleRuntimeException(IllegalArgumentException ex){log.error("IllegalArgumentException is " + ex.getMessage());return new JsonResult(StatusCode.OPERATION_FAILED,ex.getMessage());}
}


3)重啟工程測試


http://localhost:8080/v1/weibo/selectById?id=-1

2 關于Throwable

在開發實踐中,通常會添加一個處理 Throwable 的方法,它將可以處理所有類型的異常,則不會再出現500錯誤!

Throwable 是 Java 所有異常(Exception)和錯誤(Error)的頂層父類

GlobalExceptionHandler中添加處理 Throwable 的方法

@ExceptionHandler
public JsonResult handleThrowable(Throwable e) {return new JsonResult(8888, "程序運行過程中出現了Throwable");
}

這個方法千萬不要隨便加,不然后續出了異常就看不出來了,可以等到項目開發的差不多了,測試bug也都找全了,準備上線了再添加。

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

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

相關文章

imx6ull-系統移植篇2—— U-Boot 命令使用(上)

目錄 前言 U-Boot 命令 help 信息查詢命令 bdinfo printenv version 環境變量操作命令 setenv 和 saveenv 修改環境變量 新建環境變量 刪除環境變量 內存操作命令 md nm mm mw cp cmp 網絡操作命令 ping 命令 dhcp 命令 nfs 命令 tftp 命令 EMMC 和 S…

vector之動態二維數組的底層

引言&#xff1a;在計算機編程領域&#xff0c;二維動態數組是一種能夠在程序運行期間動態調整其大小的二維數組數據結構。它與靜態二維數組的關鍵區別在于&#xff0c;靜態二維數組在編譯時就需要確定其大小&#xff0c;而二維動態數組的大小可以在程序運行過程中根據實際需求…

第十六天,7月10日,八股

1、mybatis的延遲加載需要時才加載關聯對象&#xff0c;而不是查詢主對象時&#xff0c;立刻加載所有關聯對象&#xff0c;這樣可以提高查詢性能并減少不必要的數據庫訪問&#xff0c;例如&#xff1a;一個訂單表包含著商品列表&#xff08;一對多&#xff09;&#xff0c;當查…

CSS中的Element語法

1.1 Element語法1.1.1 案例 1. 快速生成10個div,并且每個div里面是從1到10的內容2.生成一個div標簽&#xff0c;類名為one,并且同時生成一個id為first的p標簽1.1.2 快速生成CSS樣式語法 CSS基本采取簡寫形式即可 比如w22 按住tab鍵 可以生成 width:200px比如lh26px 按住tab鍵 可…

Go從入門到精通(21) - 一個簡單web項目-添加swagger文檔

Go從入門到精通(20)-一個簡單web項目-服務搭建 文章目錄Go從入門到精通(20)-一個簡單web項目-服務搭建前言前期準備為API 添加 Swagger 文檔1.安裝依賴2.添加 Swagger 注釋main.goapp.goapi.gopublic_handler.goauth_handler.gocommon_constant.gocommon_dto.gotoken_utils.go3…

自動駕駛環境感知:天氣數據采集與融合技術實戰

天氣與我們日常各類生活場景密不可分&#xff0c;在駕駛場景里當車主發動汽車準備駛向目的地時&#xff0c;窗外的陰晴或許只是直觀感受&#xff0c;而真正影響駕駛安全與行程效率的&#xff0c;可能是幾公里外的突發暴雨、橋面的結冰預警&#xff0c;或是前方路段的強側風等級…

基于svga+uniapp的微信小程序動畫組件開發指南

lottie動畫指南 效果 概述 本項目使用 svgaplayer.weapp.js 庫來實現 SVGA 動畫播放功能&#xff0c;支持在微信小程序、H5 等多端環境下播放高質量的矢量動畫。SVGA 是一種跨平臺的開源動畫格式&#xff0c;具有文件小、渲染性能高的特點。 技術棧 核心庫: svgaplayer.wea…

數據結構與算法——計算直線的交點數

前言&#xff1a; 這是之前做的一道筆試題&#xff0c;當時沒寫出來煩惱很久&#xff0c;這次記錄一下。 題目鏈接&#xff1a; Dotcpp--題目 1174: 計算直線的交點數 參考文章&#xff1a; CSDN--槐陽7--計算直線的交點數 題目&#xff1a; 解題思考&#xff1a; 在當時…

大模型及agent開發6 OpenAI Assistant API 高階應用 - 流式輸出功能

1.Assistant API 的主要優點&#xff1a; 減少編碼工作量、自動管理上下文窗口、安全的訪問控制、工具和文檔的輕松集成 本節講應用設計和性能流式輸出&#xff1a;借助流式輸出&#xff0c;可以讓應用程序實時處理和響應用戶輸入。具體來說&#xff0c;這種技術允許數據在生成…

React Native安卓劉海屏適配終極方案:僅需修改 AndroidManifest.xml!

&#x1f4cc; 問題背景在 React Native 開發中&#xff0c;我們經常會遇到安卓設備劉海屏&#xff08;Notch&#xff09;適配問題。即使正確使用了 react-native-safe-area-context 和 react-navigation&#xff0c;在一些安卓設備&#xff08;如小米、華為、OPPO 等&#xff…

Spring Boot整合MyBatis+MySQL實戰指南(Java 1.8 + 單元測試)

一、環境準備 開發工具&#xff1a;IntelliJ IDEA 2023.1 JDK 1.8.0_382 Maven3.6.3數據庫&#xff1a;MySQL 8.0.21依賴版本&#xff1a;<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifact…

游戲開發日記

如何用數據表來儲存&#xff0c;位置坐標&#xff08;XYZ&#xff09;&#xff1a;決定了對象在世界中的擺放資源ID / 圖片URL&#xff1a;決定了使用什么模型或貼圖事件ID / 特效&#xff1a;是否觸發某些事件&#xff08;例如點擊、交互&#xff09;邏輯索引&#xff08;Grid…

如何使用xmind編寫測試用例

如何使用xmind編寫測試用例為什么要使用xmind&#xff1f;使用xmind編寫測試用例是為了梳理我們的思路。使用xmind編寫測試用例的思路是什么&#xff1f;先進行分析再提取測試用例。 例如下面的注冊功能的測試用例的分析&#xff1a; 分析&#xff1a; 先提取出需要測試的功能點…

使用LLaMA-Factory微調Qwen2.5-VL-3B 的目標檢測任務-數據集格式轉換(voc 轉 ShareGPT)

一、LLaMA-Factory Qwen2.5-VL ShareGPT 格式要求ShareGPT 格式就是多輪對話的 list&#xff0c;每條數據如下&#xff1a;[{"conversations": [{"from": "user", "value": "<image>\n請標注圖片中的所有目標及其類別和位…

【SkyWalking】服務端部署與微服務無侵入接入實戰指南

【SkyWalking】服務端部署與微服務無侵入接入實戰指南 &#x1f4a1; SkyWalking 系列總引導 在微服務架構快速演進的今天&#xff0c;如何有效實現服務鏈路追蹤、性能分析、日志采集與自動化告警&#xff0c;成為系統穩定性的關鍵保障手段。 SkyWalking&#xff0c;作為 Apa…

LVDS系列20:Xilinx 7系ISERDESE2原語(一)

Xilinx 7系FPGA bank的io單元如下&#xff1a;Hr bank比hp bank少odelaye2組件&#xff0c;兩者的idelaye2組件后面&#xff0c;都有iserdese2組件&#xff1b; iserdese2組件是一種專用的串并轉換器或稱解串器&#xff0c;用于高速源同步應用&#xff0c;如大部分LVDS信號解析…

【U-Boot】Shell指令

目錄 U-Boot 三個Shell U-Boot Shell Linux Shell shell腳本 總結 U-Boot Shell命令 幫助命令 部分命令分類與功能說明 一、基礎操作與信息查詢 二、內存操作 三、啟動管理 四、文件系統操作 五、設備與分區管理 六、環境變量 七、診斷與調試 八、特殊功能 九…

《Revisiting Generative Replay for Class Incremental Object Detection》閱讀筆記

摘要Abstract部分 原文 Generative replay has gained significant attention in class-incremental learning; however, its application to Class Incremental Object Detection (CIOD) remains limited due to the challenges in generating complex images with precise …

Mysql: Bin log原理以及三種格式

目錄 一、什么是 Binlog&#xff1f; 二、Binlog 的應用場景與案例 1. 數據恢復 (Point-in-Time Recovery) 2. 主從復制 (Master-Slave Replication) 3. 數據審計 三、Binlog 的三種格式 1. STATEMENT 模式 (Statement-Based Logging - SBL) 2. ROW 模式 (Row-Based Log…

LiteHub之文件下載與視頻播放

文件下載 前端請求 箭頭函數 //這個箭頭函數可以形象理解為&#xff0c;x流入&#xff08;>&#xff09;x*x, //自然而然>前面的就是傳入參數,>表示函數體 x > x * x//相當于 function (x) {return x * x; }//如果參數不是一個&#xff0c;就需要用括號()括起來…