Spring Boot:異常處理

Spring Boot

  • 前言
  • 使用自定義錯誤頁面處理異常
  • 使用 @ExceptionHandler 注解處理異常
  • 使用 @ControllerAdvice 注解處理異常
  • 使用配置類處理異常
  • 使用自定義類處理異常

在這里插入圖片描述

前言

在 Spring Boot 中,異常處理是一個重要的部分,可以允許開發者優雅地處理應用程序中可能發生的錯誤和異常。Spring Boot 提供了一套完整的機制來處理異常,包括全局異常處理、特定異常處理以及自定義錯誤頁面等。而當 Spring Boot 應用程序中發生異常時,Spring Boot 默認會提供一個錯誤頁面來顯示錯誤信息。這個默認的錯誤頁面通常包括一個錯誤狀態碼(如 404 或 500 ),一個簡短的錯誤描述,以及一個可選的堆棧跟蹤(這取決于應用程序的配置)。通常情況下,開發者往往傾向于自定義錯誤頁面。下面簡單介紹 Spring Boot 異常處理的方式。
在這里插入圖片描述

使用自定義錯誤頁面處理異常

在 Spring Boot 中,自定義錯誤頁面是一種常用來處理異常的方式,并提供用戶友好的反饋。開發者可以為特定的 HTTP 狀態碼(如404、 500等)創建自定義的錯誤頁面,也可以創建一個通用的錯誤頁面來處理所有未捕獲的異常。

簡單示例:
首先,在 src/main/resources/templates 目錄下創建一個錯誤頁面,名為 Error.html 的 Thymeleaf 視圖模板

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>ErrorDemo</title>
</head><body><h1 th:text="${status}">異常狀態碼</h1><p th:text="${error}">錯誤提示信息</p><p th:if="${message}">異常消息<span th:text="${message}"></span></p><p th:text="exception">錯誤對象</p><p th:text="errors">JSR303數據校驗的異常信息</p><p>Return to <a th:href="@{/}">Home</a>.</p></body>
</html>

然后,創建 Controller 包再創建一個 TestController 類,并創建一個 Test.html

package cn.edu.SpringBootExceptionHandlingDemo.Controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class TestController {@GetMapping("/Test.html")public String index(){return "Test";}
}

最后,啟動 Spring Boot ,故意觸發異常(如訪問一個不存在的 URL ),以查看自定義錯誤頁面
結果如圖:
在這里插入圖片描述

使用 @ExceptionHandler 注解處理異常

在 Spring 中,@ExceptionHandler 注解允許指定一個方法來處理特定類型的異常。當你在控制器( Controller )或全局異常處理類(使用@ControllerAdvice 注解)中使用 @ExceptionHandler 注解時,Spring 會自動將匹配的異常傳遞給相應的方法進行處理。

簡單示例:
首先,在 TestController 類上添加一個數學運算的實現,再使用 @ExceptionHandler 注解指定數字運算類型的異常使用 testError() 方法進行異常處理

package cn.edu.SpringBootExceptionHandlingDemo.Controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
public class TestController {@GetMapping("/Test.html")public String index(){double math = 20240329/0;return "Test";}// 指定數字運算異常后,使用該方法進行異常處理@ExceptionHandler(value = {java.lang.ArithmeticException.class})public ModelAndView testError(Exception exception){ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("err",exception);// 指定錯誤視圖模板modelAndView.setViewName("ErrorExceptionHandler");return modelAndView;}
}

然后,在 Test.html 上添加運算結果,并創建錯誤視圖模板 ErrorExceptionHandler.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Test</title>
</head>
<body>運算結果為:<p th:text="${math}" />Hello World!!!
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>ErrorExceptionHandlerDemo</title>
</head>
<body>異常信息:[[${err}]]
</body>
</html>

最后,啟動 Spring Boot ,打開瀏覽器輸入 http://localhost:8080/Test.html 并按下回車鍵
結果如圖:
在這里插入圖片描述

使用 @ControllerAdvice 注解處理異常

使用 @ExceptionHandler 注解雖然比自定義錯誤頁面更加靈活處理異常,但是只局限于使用該注解的 Controller 類內部上。而使用@ControllerAdvice 注解可以定義一個類來包含多個 @ExceptionHandler 方法,每個方法處理特定類型的異常。這樣,便不需要在每個控制器中重復編寫異常處理邏輯了。

簡單示例:
在 Contoller 包內創建一個 AdviceController 類,將上述 @ExceptionHandler 方法剪切到該位置

package cn.edu.SpringBootExceptionHandlingDemo.Controller;import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;@ControllerAdvice
public class AdviceController {// 指定數字運算異常后,使用該方法進行異常處理@ExceptionHandler(value = {java.lang.ArithmeticException.class})public ModelAndView testError(Exception exception){ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("err",exception);// 指定錯誤視圖模板modelAndView.setViewName("ErrorExceptionHandler");return modelAndView;}
}

最后,啟動 Spring Boot ,打開瀏覽器輸入 http://localhost:8080/Test.html 并按下回車鍵
結果一樣,但使用 @ControllerAdvice 注解無需重復編寫異常處理邏輯:
在這里插入圖片描述

使用配置類處理異常

在 Spring 中,SimpleMappingExceptionResolver 是一個方便的異常解析器,可以將特定類型的異常映射到特定的視圖名稱,使得異常處理更加簡單和統一;也可以通過配置類來配置 SimpleMappingExceptionResolver ,以便在應用程序中全局處理異常。

簡單示例:
創建 Configuration 包并在包內創建一個 ErrorConfiguration 配置類,將 AdviceController 類移除或注釋以免影響測試結果

package cn.edu.SpringBootExceptionHandlingDemo.Configuration;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;import java.util.Properties;@Configuration
public class ErrorConfiguration {@Beanpublic SimpleMappingExceptionResolver simpleMappingExceptionResolver(){SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver();Properties properties = new Properties();// 異常處理類型、顯示錯誤視圖名稱properties.put("java.lang.ArithmeticException","ErrorExceptionHandler.html");simpleMappingExceptionResolver.setExceptionMappings(properties);// 指定異常信息變量名稱為 err ,默認為 exceptionsimpleMappingExceptionResolver.setExceptionAttribute("err");return simpleMappingExceptionResolver;}
}

最后,啟動 Spring Boot ,打開瀏覽器輸入 http://localhost:8080/Test.html 并按下回車鍵
結果一樣:
在這里插入圖片描述

使用自定義類處理異常

在 Spring Boot 中,也可以創建一個自定義的異常處理器,通常通過實現 HandlerExceptionResolver 接口或繼承 SimpleMappingExceptionResolver 類,并在其中添加自定義邏輯,便可以處理異常。

簡單示例:
接著,在 Configuration 內創建一個 CustomErrorConfiguration 自定義類并實現 HandlerExceptionResolver 接口,將 ErrorConfiguration 配置類和 AdviceController 類移除或注釋以免影響測試結果

package cn.edu.SpringBootExceptionHandlingDemo.Configuration;import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;@Configuration
public class CustomErrorConfiguration implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {ModelAndView modelAndView = new ModelAndView();// 數字運算類型異常if(ex instanceof ArithmeticException){modelAndView.setViewName("ErrorExceptionHandler");}// 異常信息對象modelAndView.addObject("err",ex);return modelAndView;}
}

最后,啟動 Spring Boot ,打開瀏覽器輸入 http://localhost:8080/Test.html 并按下回車鍵
結果一樣:
在這里插入圖片描述

注:
以上是 Spring Boot 異常處理的方式,比較推薦的是使用 @ControllerAdvice 注解和使用配置類處理異常。

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

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

相關文章

復利效應(應用于成長)

應用 每個人在智力、知識、經驗上&#xff0c;復利效應都一樣&#xff0c;只要能積累的東西&#xff0c;基本上最終都會產生復利效應。 再來看一下復利公式&#xff1a;FP*(1i)^n P本金&#xff1b;i利率&#xff1b;n持有期限。在使用時&#xff0c;一定要注意4個限定條件&a…

AI圖書推薦:ChatGPT等生成式AI在高等教育中的應用

自2022年11月以來&#xff0c;ChatGPT及其在高等教育各個層面的影響已成為所有教育對話的核心內容。Chan和Colloton所著的書籍是首批全面探討ChatGPT與生成式人工智能&#xff08;GenAI&#xff09;在高等教育中應用及影響的作品之一。 該書深入研究了針對專業環境定制的AI素養…

js中Array的2個容易被遺忘的函數some和array

Array.prototype.some() 和 Array.prototype.every() 是 JavaScript 中的兩個容易被遺忘的數組方法。它們都用于檢查數組中的元素是否滿足某個條件。 1. Array.prototype.some() some() 方法用于檢查數組中至少有一個元素滿足給定的條件。當找到滿足條件的元素時&#xff0c;…

基礎學習-Git(分布式版本控制系統)

學習視頻推薦 http://【黑馬程序員Git全套教程&#xff0c;完整的git項目管理工具教程&#xff0c;一套精通git】 https://www.bilibili.com/video/BV1MU4y1Y7h5/?p5&share_sourcecopy_web&vd_source2b85bd9be9213709642d908906c3d863 1、Git環境配置 安裝Git Git下…

wireshark_概念

ARP (Address Resolution Protocol&#xff09;協議&#xff0c;即地址解析協議。該協議的功能就是將IP地址解析成MAC地址。 混雜模式 抓取經過網卡的所有數據包&#xff0c;包括發往本網卡和非發往本網卡的。 非混雜模式 只抓取目標地址是本網卡的數據包&#xff0c;對于發往…

《控制系統實驗與綜合設計》綜合四至六(含程序和題目)

1.電機模型辨識實驗 1.1 實驗目的 &#xff08;1&#xff09;掌握一階系統階躍響應的特點&#xff0c;通過實驗加深對直流電解模型的理解&#xff1b; &#xff08;2&#xff09;掌握系統建模過程中參數的整定&#xff0c;體會參數變化對系統的影響&#xff1b; &#xff0…

單片機開發板上外設資源講解

單片機開發電路板上簡單外設 開發板上各基礎外設LED燈按鍵&#xff1a;數碼管介紹液晶屏矩陣鍵盤掃描的概念LED點陣屏實時時鐘蜂鳴器存儲器 溫度傳感器&單總線 開發板上各基礎外設 LED燈 中文名&#xff1a;發光二極管 外文名&#xff1a;Light Emitting Diode 簡稱&…

楊校老師項目之基于單片機STC89C52的智能環境監測系統【嵌入式】

獲取全套資料&#xff1a; 有償獲取&#xff1a;mryang511688 技術&#xff1a;C語言、單片機等 摘要&#xff1a; 此設計可分為三個主要部分。此中的溫度和濕度的檢測功能&#xff0c;通過操縱單總線型溫濕度傳感器DHT11以數字形式顯示&#xff0c;實現了切確測得溫濕度的功能…

如何管理多個版本的Node.js

我們如何在本地管理多個版本的Node.js&#xff0c;有沒有那種不需要重新安裝軟件再修改配置文件和環境變量的方法&#xff1f;經過我的查找&#xff0c;還真有這種方式&#xff0c;那就是nvm&#xff08;Node Version Manager&#xff09;。 下面我就給大家介紹下NVM的使用 1…

vs2019 c++中模板 enable_if_t 的使用

&#xff08;1&#xff09; 該模板的定義如下&#xff1a; template <bool _Test, class _Ty void> struct enable_if {}; // no member "type" when !_Testtemplate <class _Ty> struct enable_if<true, _Ty> { // type is _Ty for _Testusing …

Golang | Leetcode Golang題解之第89題格雷編碼

題目&#xff1a; 題解&#xff1a; func grayCode(n int) []int {ans : make([]int, 1<<n)for i : range ans {ans[i] i>>1 ^ i}return ans }

MSR810-LM快速配置通過LTE模塊上網

正文共&#xff1a;1111 字 13 圖&#xff0c;預估閱讀時間&#xff1a;1 分鐘 之前買了一個無線版本的MSR810-W&#xff08;淘了一臺二手的H3C企業路由器&#xff0c;就用它來打開網絡世界的大門&#xff09;&#xff0c;并整理了一份快速配置&#xff08;腳本案例來了&#x…

三菱FX3U-4AD模擬量電壓輸入采集實例

硬件&#xff1a;&#xff30;&#xff2c;&#xff23;模塊 &#xff26;&#xff38;&#xff13;&#xff27;&#xff21;-&#xff12;&#xff14;&#xff2d;&#xff34; &#xff1b;&#xff21;&#xff0f;&#xff24;模塊&#xff26;&#xff38;&#xff13…

SQL——SERVER的建表主要操作

目錄 一&#xff1a;數據存儲問題 1.表的相關數據 2.表&#xff0c;字段&#xff0c;記錄 二&#xff1a;建表 1.創建表頭 2. 數據類型 3.保存數據 4.數據冗余 5.使用命令重置表 7.設置主鍵 一&#xff1a;數據存儲問題 1.表的相關數據 表是數據庫的基本單位&…

交互原型設計工具 Axure RP 9 for Mac 正式激活版

Axure RP 9 Pro Mac版是Mac平臺上的一款專為快速原型設計而生的應用&#xff0c;Axure RP 9 Pro Mac版可以輔助產品經理快速設計完整的產品原型&#xff0c;并結合批注&#xff0c;說明以及流程圖&#xff0c;框架圖等元素&#xff0c;將產品完整地表述給各方面設計人員&#x…

Android Studio(AS)使用別人的項目與gradle包并運行項目

一、問題描述 在進行AS開發時&#xff0c;我們可能會使用到別人的項目&#xff0c;但發現別人把項目發給我們后會發現gradle項目同步失敗o(≧口≦)o&#xff0c;此時計有三&#xff1a; 1.橫行霸道、豪取搶奪&#xff1a;直接空降到項目人那里&#xff0c;強他的電腦占為己有…

Numpy的數組操作

文章目錄 數組的創建創建全0的二維數組a(3,3)全1的二維數組b&#xff08;3,4&#xff09;隨機數二維數數組c&#xff08;2,3&#xff09;效果截圖 數組的屬性查看b數組的維度查看b數組元素的個數效果截圖 數組的維度操作將數組c的行變列&#xff0c;返回最后一個元素返回數組c第…

python 虛擬環境-最簡單的教程

查看當前 python 的安裝路徑 which python 1、Anaconda創建虛擬環境 (1)執行命令&#xff1a;conda create --name env_name python3.10&#xff0c; 命令中我制定了環境名稱是env_name&#xff0c;指定了Python版本是3.10&#xff0c;執行命令后&#xff0c;Conda會自動下…

【回溯】1240. 鋪瓷磚

本文涉及知識點 回溯 LeetCode1240. 鋪瓷磚 你是一位施工隊的工長&#xff0c;根據設計師的要求準備為一套設計風格獨特的房子進行室內裝修。 房子的客廳大小為 n x m&#xff0c;為保持極簡的風格&#xff0c;需要使用盡可能少的 正方形 瓷磚來鋪蓋地面。 假設正方形瓷磚的…

前端面試題復習 - 性能優化

圖片加載優化 很多修飾類圖片完全可以用css代替對于移動端來說&#xff0c;很多圖片都可以用CDN加載小圖使用base64格式使用雪碧圖能夠顯示WebP格式的瀏覽器盡量使用WebP格式。因為WebP格式具有更好的圖像數據壓縮算法&#xff0c;能帶來更小的圖片體積&#xff0c;而且擁有肉…