小白的springboot之路(十)、全局異常處理

来源:https://www.cnblogs.com/yanghj/archive/2019/12/18/12058749.html
-Advertisement-
Play Games

0、前言 任何系統,我們不會傻傻的在每一個地方進行異常捕獲和處理,整個系統一般我們會在一個的地方統一進行異常處理,spring boot全局異常處理很簡單; 介紹前先說點題外話,我們現在開發系統,都是前後端完全分離的,後端只提供RESTfull API,禁止涉及任何界面,什麼thymeleaf、JS ...


0、前言

  任何系統,我們不會傻傻的在每一個地方進行異常捕獲和處理,整個系統一般我們會在一個的地方統一進行異常處理,spring boot全局異常處理很簡單;

  介紹前先說點題外話,我們現在開發系統,都是前後端完全分離的,後端只提供RESTfull API,禁止涉及任何界面,什麼thymeleaf、JSP那些後端模板,是絕對禁止使用的,那些東西請扔垃圾箱,不要浪費大好青春去研究,那是墮落;前端則負責界面相關,常用Vue;如果公司還沒前後端分離,還在thymeleaf還在前後端一起寫,那你還是早做跳槽打算吧,他們養不起你,更養不起你的家人;

  前後端分離,後端API,一般對於異常處理,要做得無非兩件事,

    1是記錄日誌及相應通知處理,這是對內的,

    2是給出返回結果給API調用者,這是對外的;

對API調用者來說,他只需要一個返回結果(包含錯誤代碼、提示信息),其他的他不關心

對後端來說,他只需要記錄日誌,通知或者給發佈相應消息給其他隊列處理相關事項;

所以:看到過不少人封裝了很多個自定義異常類,其實,完全沒有必要,只需要一個異常處理來處理所有異常即可,然後封裝一個錯誤識別碼和提示消息的枚舉,用於返回給API調用者;然後後端的處理,直接在一個異常處理方法中全部處理就行了,完全沒必要封裝N多個自定義異常,那沒有任何意義;

 

0-1、關於異常的思想認識

  我們應該認識到,一切異常,對系統來說,都是不正常的表現,都是屬於缺陷,都屬於BUG,儘管有些異常是我們主動拋出的;

  我們要做的,是應該儘量提高系統可用性,最大限度避免任何異常的出現,而不是去指望完善異常處理來完善系統;

  異常處理,是異常無法避免的出現了而採取的一種應急措施,主要目的是對外增加友好性,對內提供補救線索;

  不要認為完善的異常處理是系統核心,他不是,不要指望異常處理盡善盡美,不要指望異常處理來給系統缺陷擦屁股;

  如果系統異常過多,那麼你要做的不是去完善異常處理機制,而是要好好去反思:系統架構設計是否合理,系統邏輯設計是否合理;

 

1、全局異常處理

使用@ControllerAdvice、@ExceptionHandler註解封裝一個異常處理類即可
package com.anson.common.exception;

import com.anson.common.result.ResultBody;
import com.anson.common.result.ResultCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @description: 全局異常處理類
 * @author: anson
 * @Date: 2019/12/17 20:56
 */

@ControllerAdvice
public class GlobalExceptionHandler
{
    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /**
     * 所有異常處理
     * @param e
     * @return
     */
    @ExceptionHandler(value =Exception.class)
    @ResponseBody
    public ResultBody exceptionHandler(Exception e)
    {
        //1、寫日誌及其他處理,對內
        logger.error("未知異常!原因是:",e);
        System.out.println("未知異常!原因是:"+e);
        
        //2、返回錯誤識別碼和提示給API調用者、對外
        return ResultBody.failed(ResultCode.FAILED);
    }
}

這樣就可以了,

ResultBody、ResultCode這個我們下節會說到;

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

-Advertisement-
Play Games
更多相關文章
  • 變速動畫函數封裝 勻速動畫:每次步數都是10 (var step=10;) 變速(緩動)動畫:每次的步數是用當前位置和目標位置相減 var step=(target-current)/10; 代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
  • [1]調試工具 [2]插件 [3]快捷鍵 [4]小功能 ...
  • 目前國產報表工具大部分都是Java版本,例如潤乾和帆軟,而C#寫的報表工具國內還沒有,介紹一款VS2010(C#)寫的國產報表工具(highreport),採用類Excel設計,零代碼實現複雜報表展示、複雜表單填報、圖表展示、參數面板、系統管理、大屏可視化、導出、列印等。 報表功能:1.報表採用類似 ...
  • JSP是一種運行在伺服器端的腳本語言,是用來開發動態網頁的技術,它是JAVA Web 程式開發的重要技術。本章介紹JSP技術的相關概念以及如何開發JSP程式,主要內容包括JSP技術簡介、JSP的處理過程、JSP語法、JSP的內置對象、每種對象的使用方法和使用技巧,以及簡單web應用程式的開發設計。 ...
  • 實例 this 是什麼? JavaScript this 關鍵詞指的是它所屬的對象。 它擁有不同的值,具體取決於它的使用位置: 在方法中,this 指的是所有者對象。 單獨的情況下,this 指的是全局對象。 在函數中,this 指的是全局對象。 在函數中,嚴格模式下,this 是 undefine ...
  • 封裝getScroll函數 1. 獲取頁面向上或者向左卷曲出去的距離的值 2. 瀏覽器的滾動事件 function getScroll() { return { left: window.pageXOffset || document.documentElement.scrollLeft || do ...
  • 分庫分表之第一篇 1.概述 1.1.分庫分表是什麼 1.2.分庫分表的方式 1.2.1.垂直分表 1.2.2.垂直分庫 1.2.3.水平分庫 1.2.4.水平分表 1.2.5 小結 1.3.分庫分錶帶來的問題 1.3.1.事務一致性問題 1.3.2.跨節點關聯查詢 1.3.3.跨節點分頁、排序函數 ...
  • 1、面向對象的四個優點:可復用、可拓展、可維護、靈活性高。編寫代碼的時候一定要牢記:靈活運用面向對象的三大特征:封裝、繼承、多態,降低代碼之間的耦合,避免做無用功,避免代碼不可維護。ps:不要懶,現在懶只會讓將來不得不勤快 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...