自定義枚舉類
自定義異常信息
統(tǒng)一返回信息
全局異常處理
01自定義枚舉類
對于一些我們經(jīng)常返回的錯誤信息,我們可以將其抽取出來封裝成公共部分,然后將變化的作為參數(shù)傳入。例如我們在業(yè)務中經(jīng)常要校驗某個字段是否為空,如果為空的話就要返回錯誤信息xxx字段不能為空,那么我們?yōu)槭裁床粚xx作為一個變量參數(shù)傳遞過來呢。于是就想到了用枚舉類定義異常信息,然后用String.format()方法進行轉義
public?enum?ResponseInfoEnum?{?SUCCESS(ResponseResult.OK,"處理成功"),?PARAM_LENGTH_ERROR(ResponseResult.ERROR,?"參數(shù):%s,長度錯誤,max?length:?%s"),?REQ_PARAM_ERROR(ResponseResult.ERROR,?"請求報文必填參數(shù)%s缺失"),;?private?Integer?code;?private?String?message;?ResponseInfoEnum(Integer?code,?String?message)?{?this.code?=?code;?this.message?=?message;?}?public?Integer?getCode()?{?return?code;?}?public?String?getMessage()?{?return?message;?}}
使用方法如下
String.format(ResponseInfoEnum.REQ_PARAM_ERROR.getMessage(),"testValue")
可以看到生成的錯誤信息是請求報文必填參數(shù)testValue缺失
02自定義異常信息
首先我們需要知道我們?yōu)槭裁匆米远x異常信息呢?使用它有什么好處呢?
首先我們開發(fā)中肯定是分模塊進行開發(fā)的,所以首先我們統(tǒng)一了自定義異常類就統(tǒng)一了對外異常的展示方式。
使用自定義異常繼承相關的異常來拋出處理后的異常信息可以隱藏底層的異常,這樣更安全,異常信息也更加的直觀。自定義異??梢話伋鑫覀冏约合胍獟伋龅男畔?,可以通過拋出的信息區(qū)分異常發(fā)生的位置,根據(jù)異常名我們就可以知道哪里有異常,根據(jù)異常提示信息進行程序修改。
有時候我們遇到某些校驗或者問題時,需要直接結束掉當前的請求,這時便可以通過拋出自定義異常來結束,如果你項目中使用了SpringMVC比較新的版本的話有控制器增強,可以通過 ControllerAdvice注解寫一個控制器增強類來攔截自定義的異常并響應給前端相應的信息。
自定義異常我們需要繼承RuntimeException
public?class?CheckException?extends?RuntimeException{?public?CheckException()?{?}?public?CheckException(String?message)?{?super(message);?}?public?CheckException(ResponseInfoEnum?responseInfoEnum,String?...strings)?{?super(String.format(responseInfoEnum.getMessage(),strings));?}}
03統(tǒng)一返回信息
在我剛開始工作的一年中,所接觸的最多的項目就是前后端交互的項目了。所以有一個統(tǒng)一的返回信息不僅對前端來說更加便利,對于我們后面的AOP代理也有很大的好處。
@Data@NoArgsConstructorpublic?class?ResponseResult<T>?{?public?static?final?Integer?OK?=?0;?public?static?final?Integer?ERROR?=?100;?private?Integer?code;?private?String?message;?private?T?data;}
這樣前后端進行交互時就會更加便利了,如果要取業(yè)務數(shù)據(jù)那么就從data中取,去過要取是否成功的標志,那么就從code碼中取,如果要取后端返回的信息,那么就從message中取。
04全局異常處理
在我之前的項目中每個Controller方法中都充斥著try....catch...的代碼,而catch后的代碼都是大同小異,都是封裝了一下返回的錯誤信息之類的。那么我們?yōu)槭裁床粚⑦@些代碼抽取出來,利用Spring的全局異常處理簡化我們的代碼呢?
@Slf4j@ControllerAdvicepublic?class?ControllerExceptionHandler?{?@ExceptionHandler(value?=?Exception.class)?@ResponseBody?public?ResponseResult<String>?defaultErrorHandler(HttpServletRequest?request,?Exception?exception){?log.error(ControllerLog.getLogPrefix()+"Exception:?{}"+exception);?return?handleErrorInfo(exception.getMessage());?}?@ExceptionHandler(CheckException.class)?@ResponseBody?public?ResponseResult<String>?checkExceptionHandler(HttpServletRequest?request,?CheckException?exception){?return?handleErrorInfo(exception.getMessage());?}?private?ResponseResult<String>?handleErrorInfo(String?message)?{?ResponseResult<String>?responseEntity?=?new?ResponseResult<>();?responseEntity.setMessage(message);?responseEntity.setCode(ResponseResult.ERROR);?responseEntity.setData(message);?ControllerLog.destoryThreadLocal();?return?responseEntity;?}}
其中全局異常處理中,我們自定義的異常就沒有打印日志,因為對于自定義的異常我們是已知的異常,并且錯誤信息也已經(jīng)很明確的返回了。而對于未知異常例如Exception就屬于未知的異常,我們就需要打印日志,如果這里有特殊需求,例如發(fā)短信、發(fā)郵件通知相關人員的話,這里也能夠進行全局的配置。
以上就是深圳達內教育java培訓機構的小編針對“Java后端開發(fā)視頻只學習需要注意哪幾點”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務。