java中的自定義異常處理機制

来源:https://www.cnblogs.com/sunyonggao/archive/2023/09/15/17705224.html
-Advertisement-
Play Games

在日常開發中我們難免會遇到各種各樣的異常問題的發生,但是任何異常如果都在異常可能會出現的地方直接去處理會讓業務邏輯顯得很臃腫,代碼看上去很冗餘。在開發Web應用程式時,異常處理是一項非常重要的任務。異常處理可以提高程式的健壯性和穩定性。Java後端開發人員可以設計一個統一的全局異常處理方案來解決異常 ...


在日常開發中我們難免會遇到各種各樣的異常問題的發生,但是任何異常如果都在異常可能會出現的地方直接去處理會讓業務邏輯顯得很臃腫,代碼看上去很冗餘。在開發Web應用程式時,異常處理是一項非常重要的任務。異常處理可以提高程式的健壯性和穩定性。Java後端開發人員可以設計一個統一的全局異常處理方案來解決異常處理的問題,避免代碼冗餘,提高開發效率。在本文中,我們將介紹如何設計Java後端的全局異常處理方案。

什麼是全局異常處理?

全局異常處理是一種將異常處理代碼從業務邏輯中分離出來的技術。

在這裡分兩種全局異常處理的方式:

一、在Java中,全局異常處理使用@ControllerAdvice註解定義一個全局的異常處理類。在該類中,使用@ExceptionHandler註解捕獲異常併進行處理。使用全局異常處理技術,可以統一處理異常,提高代碼的復用性,降低代碼的冗餘度。

如下:

    // 全局異常處理類

@Slf4j
@RestControllerAdvice // @ResponseBody+@ControllerAdvice註解的結合體,@ControllerAdvice註解表示該類是全局異常處理類
public class ExceptionDeal {

// 根據括弧內的異常種類,全局如有相應的異常,則會被此註解捕獲,進行方法內的下一步操作
@ExceptionHandler(ArithmeticException.class)
public String exceptions(ArithmeticException e) {
log.info("全局異常:{}",e.getMessage());
return "演算法異常";
}

// 任何空指針異常會被該方法捕獲處理
@ExceptionHandler(NullPointerException.class)
public String exceptions1(NullPointerException e) {
log.info("全局異常:{}",e.getMessage());
return "空指針異常";
}
}

// 測試類
@RestController
@RequestMapping("/demo")
public class TestDemo {
@RequestMapping("/test")
public String getInfo(){
int a = 1/0;
return a+"";
}

@RequestMapping("/test1")
public String getInfos(){
String s=null;
BigDecimal bigDecimal = new BigDecimal(s);
return bigDecimal.toString();
}
}

二、利用面向切麵編程(AOP)可以更方便地實現Java後端的全局統一異常處理。我們可以通過AOP將異常處理代碼從業務邏輯代碼中分離出來,降低代碼耦合度,提高代碼的可維護性和可擴展性。
@Component
@Aspect
@Slf4j
public class Aspects {

// 切入點(此處TestDemo類下的所有方法被執行時,均會被切麵捕獲處理)
@Pointcut("execution(* com.demo.controller.TestDemo.*(..))")
public void pt() {
}

// 製作切麵
@Around("pt()")
public Object handleException(ProceedingJoinPoint pjp) throws Throwable {
Object result;
try {
result = pjp.proceed();
log.info("信息是:{}", result);
} catch (Exception e) {
log.info("異常信息:{}", e.getMessage());
return "切麵捕獲異常成功!";
}
return result;
}
}
// 測試類
@RestController
@RequestMapping("/demo")
public class TestDemo {
@RequestMapping("/test")
public String getInfo(){
int a = 1/0;
return a+"";
}

@RequestMapping("/test1")
public String getInfos(){
String s=null;
BigDecimal bigDecimal = new BigDecimal(s);
return bigDecimal.toString();
}
}




您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 背景 應用背景:vite搭建的vue3項目 需求背景:功能都涉及了支付業務,故需要和外部支付系統對接 外部支付系統:聚合支付、微信小程式支付、微信H5支付 目錄 讀完本文,你將會對以下幾個坑點有所瞭解: 對接第三方服務商過程踩坑 對接小程 ...
  • 分享的 HTML 與上圖內容一樣,需要修改的小伙伴可以自行修改內容。 <style><!-- @import url("https://fonts.googleapis.com/css?family=Share+Tech+Mono|Montserrat:700"); * { margin: 0; p ...
  • 系統設計之緩存五種策略 當我們在架構中引入緩存時,緩存和資料庫之間的同步就變得不可避免。 讓我們看看如何保持數據同步的五種常見策略。 1)閱讀策略: 緩存在一邊 通讀2)寫策略:寫周圍 回信 寫通緩存策略經常組合使用。例如,write-around 通常與 cache-aside 一起使用,以確保緩 ...
  • 一、背景介紹 我們團隊一直在持續推進業務系統的體系化治理工作,在這個過程中我們沉澱了自己的DDD腳手架項目。腳手架項目是體系化治理過程中比較重要的一環,它的作用有兩點: 可以對新建的項目進行統一的規範 對於指導老項目進行DDD的改造提供指導 本文主要是梳理和總結了DDD腳手架使用中的編碼規範以及遇到 ...
  • 在設備維修保養管理中,及時通知相關人員是確保設備得到及時維護的關鍵。API介面提供了一個方便的方式來自動發送維修保養通知,以確保工作流程的順利進行。本文將詳細介紹如何使用成熟的API介面來發送設備維修保養通知,以確保設備得到及時的維護,同時提供通俗易懂的步驟和代碼說明。 什麼是API介面? 首先,讓 ...
  • Python安裝 許多PC和Mac已經預裝了Python。 要檢查在Windows PC上是否安裝了Python,請在開始菜單中搜索Python,或在命令行(cmd.exe)上運行以下命令: C:\Users\Your Name>python --version 要檢查在Linux或Mac上是否安裝 ...
  • 原文在這裡。 由 Johan Brandhorst-Satzkorn, Julien Fabre, Damian Gryski, Evan Phoenix, and Achille Roussel 發佈於 2023年9月13日 Go 1.21添加了一個新的埠,通過新的GOOS值wasip1來定位W ...
  • Matplotlib庫 由於誕生的比較早,所以其預設的顯示樣式很難符合現在的審美,這也是它經常為人詬病的地方。 不過,經過版本更迭之後,現在 Matplotlib 已經內置了很多樣式表,通過使用不同的樣式表,可以整體改變繪製圖形的風格,不用再調整一個個顯示參數。 1. 樣式表的使用 1.1. 所有內 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...