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這個我們下節會說到;