任何系統,咱們不會傻傻的在每個地方進行異常捕獲和處理,整個系統通常咱們會在一個的地方統一進行異常處理,spring boot全局異常處理很簡單;前端
介紹前先說點題外話,咱們如今開發系統,都是先後端徹底分離的,後端只提供RESTfull API,禁止涉及任何界面,什麼thymeleaf、JSP那些後端模板,是絕對禁止使用的,那些東西請扔垃圾箱,不要浪費大好青春去研究,那是墮落;前端則負責界面相關,經常使用Vue;若是公司還沒先後端分離,還在thymeleaf還在先後端一塊兒寫,那你仍是早作跳槽打算吧,他們養不起你,更養不起你的家人;web
先後端分離,後端API,通常對於異常處理,要作得無非兩件事,spring
1是記錄日誌及相應通知處理,這是對內的,後端
2是給出返回結果給API調用者,這是對外的;架構
對API調用者來講,他只須要一個返回結果(包含錯誤代碼、提示信息),其餘的他不關心前後端分離
對後端來講,他只須要記錄日誌,通知或者給發佈相應消息給其餘隊列處理相關事項;spa
咱們應該認識到,一切異常,對系統來講,都是不正常的表現,都是屬於缺陷,都屬於BUG,儘管有些異常是咱們主動拋出的;架構設計
咱們要作的,是應該儘可能提升系統可用性,最大限度避免任何異常的出現,而不是去期望完善異常處理來完善系統;設計
異常處理,是異常沒法避免的出現了而採起的一種應急措施,主要目的是對外增長友好性,對內提供補救線索;日誌
不要認爲完善的異常處理是系統核心,他不是,不要期望異常處理盡善盡美,不要期望異常處理來給系統缺陷擦屁股;
若是系統異常過多,那麼你要作的不是去完善異常處理機制,而是要好好去反思:系統架構設計是否合理,系統邏輯設計是否合理;
使用@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) { //一、寫日誌及其餘處理,對內 logger.error("未知異常!緣由是:",e); System.out.println("未知異常!緣由是:"+e); //二、返回錯誤識別碼和提示給API調用者、對外 return ResultBody.failed(ResultCode.FAILED); } }
這樣就能夠了,
ResultBody、ResultCode這個咱們下節會說到;