小白的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
  • 示例項目結構 在 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# ...