springboot(2.2.4)全局异常处理(RestControllerAdvice,ExceptionHandler)
當(dāng)程序出現(xiàn)異常我們一般try,catch處理,這樣代碼結(jié)構(gòu)不好看,我們希望程序員寫的代碼業(yè)務(wù)和框架是分離的,通過(guò)注解進(jìn)行綁定使用。springboot里通過(guò)@RestControllerAdvice注解定義全局異常處理類,通過(guò)@ExceptionHandler(異常類型.class)攔截對(duì)應(yīng)的異常。
我希望實(shí)現(xiàn)的是,前臺(tái)發(fā)出請(qǐng)求,如果后臺(tái)發(fā)生異常,后臺(tái)把異常信息輸出到日志,返回給前臺(tái)500錯(cuò)誤碼和我們自定義的錯(cuò)誤message而不是返回整個(gè)錯(cuò)誤堆棧給前臺(tái),雖然前段框架比如Vue、React等有自己的請(qǐng)求返回?cái)?shù)據(jù)結(jié)構(gòu),但是如果發(fā)生異常還是會(huì)得到整個(gè)堆棧信息,對(duì)客戶不友好,當(dāng)然我們前臺(tái)也可以對(duì)這些異常進(jìn)行處理進(jìn)而給用戶比較友好的界面,但是后臺(tái)的錯(cuò)誤應(yīng)該由后臺(tái)處理較合適。比較適用于前后端分離的架構(gòu)。代碼如下:
package com.example.demo.exception;import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.web.bind.annotation.RestControllerAdvice; import com.alibaba.fastjson.JSONObject; import com.example.demo.util.Constant;/*** @author lijinfei* @Desc* @date 2020/3/26 14:45 Version: 1.0*/ @RestControllerAdvice public class ExceptionHandler {private static final Logger logger = LogManager.getLogger(ExceptionHandler.class);private static final String ERROR_MESSAGE = "后臺(tái)跑丟了,sorry";@org.springframework.web.bind.annotation.ExceptionHandler(Exception.class)public Object handlerException(Exception e) {// 返回給前臺(tái)JSONObject jsonObject = new JSONObject();jsonObject.put(Constant.STATUS, 500);jsonObject.put(Constant.MESSAGE, ERROR_MESSAGE);// 日志記錄錯(cuò)誤,包括堆棧信息logger.error(e.getMessage(), e);return jsonObject;}// 這個(gè)異常ArithmeticException粒度小于Exception,如果發(fā)生這個(gè)異常,則被此方法攔截//@org.springframework.web.bind.annotation.ExceptionHandler(ArithmeticException.class)// public Object handArithmeticException(Exception e) {// JSONObject jsonObject = new JSONObject();// jsonObject.put(Constant.STATUS, 501);// jsonObject.put(Constant.MESSAGE, e.getMessage());// logger.error(e.getMessage(), e);// return jsonObject;// } }注釋掉的這個(gè)攔截ArithmeticException異常的方法,如果發(fā)生ArithmeticException,會(huì)使用這個(gè)方法處理,因?yàn)锳rithmeticException粒度小于Exception。我們可以定義各種各樣的異常攔截,比如空指針、參數(shù)錯(cuò)誤、數(shù)學(xué)異常等很多的RuntimeException,也可以自定義異常類進(jìn)行攔截。我感覺(jué)沒(méi)有必要,?當(dāng)異常發(fā)生后真正有用的信息是堆棧信息,所以只需要一個(gè)總得Exception就夠了,把堆棧信息寫到日志里便于跟蹤定位就行。歡迎批評(píng)指正。
?
總結(jié)
以上是生活随笔為你收集整理的springboot(2.2.4)全局异常处理(RestControllerAdvice,ExceptionHandler)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: druid连接池配置数据库密码加密
- 下一篇: ubuntu18.04.4 LTS 安装