Java Springboot全局異常處理
前言
對(duì)于作為菜鳥(niǎo)程序員的我來(lái)說(shuō),經(jīng)常在controller使用try-catch 來(lái)包裹住我的service層代碼,首頁(yè),他及其的不好看,其次,每個(gè)方法都有這種代碼塊,思考有沒(méi)有辦法去掉它,并且優(yōu)雅的處理異常。這就是今天要說(shuō)的全局異常捕獲
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、思路?
springboot提供了全局異常處理的注解,我們需要弄明白的是。撲捉什么異常,結(jié)果如果返回,如何優(yōu)雅的管理返回的結(jié)果集。
二、步驟
1.自定義接口:
自定義接口主要是描述返回的code碼和返回msg,自定義錯(cuò)誤描述枚舉需要實(shí)現(xiàn)這個(gè)接口
public interface ErrorType { /** * 返回code * * @return */ String getCode(); /** * 返回mesg * * @return */ String getMesg(); }
2.自定義錯(cuò)誤枚舉
使用枚舉,看起來(lái)代碼很優(yōu)雅,并且不用使用static final來(lái)定義類型。
@Getter public enum SystemErrorType implements ErrorType { SYSTEM_ERROR("-1", "系統(tǒng)異常"), SYSTEM_BUSY("000001", "系統(tǒng)繁忙,請(qǐng)稍候再試"); /** * 錯(cuò)誤類型碼 */ private String code; /** * 錯(cuò)誤類型描述信息 */ private String mesg; SystemErrorType(String code, String mesg) { this.code = code; this.mesg = mesg; } }
3.自定義異常類
@Getter public class MyException extends RuntimeException{ /** * 異常對(duì)應(yīng)的錯(cuò)誤類型 */ private final ErrorType errorType; /** * 默認(rèn)是系統(tǒng)異常 */ public MyException () { this.errorType = SystemErrorType.SYSTEM_ERROR; } public MyException(SystemErrorType systemErrorType) { this.errorType = systemErrorType; }
4.異常捕獲
@RestControllerAdvice @Slf4j public class GlobalExceptionHandlerAdvice extends DefaultGlobalExceptionHandlerAdvice { @ExceptionHandler(value = {MyException .class}) public Result MyException (MyException ex) { log.error(ex.getMessage()); return Result.fail(ex.getErrorType()); } @ExceptionHandler(value = {NotRoleException.class}) public Result NotRoleException(NotRoleException nle) { // 打印堆棧,以供調(diào)試 //nle.printStackTrace(); String message = "該功能僅供"+nle.getRole()+"使用!"; // 返回給前端 return Result.fail("090017",message,null); } }
也不是說(shuō)只能通過(guò)枚舉來(lái)返回,只要你的返回工具類支持參數(shù)填寫(xiě),可以做類似于第二種的返回,但是這樣方法對(duì)于返回的code來(lái)太好管理
5.在代碼中拋異常
比如我做判空處理時(shí),利用枚舉作為參數(shù)返回
@PostMapping("/listQuestionVO") public Result listQuestionBankVO(@RequestBody QuestionBankQuery query){ if (query.getPageNum()==null || query.getPageSize()==null){ return Result.fail(QuestionnaireErrorType.PARAMETERISNULL_ERROR); } Result result = questionBankService.listQuestionBankVO(query); return result; }
實(shí)際上,你可以在你需要處理異常的地方直接throws異常,可以直接在方法上throws拋出,等待全局異常捕獲
總結(jié)
只要管理code到位,用返回類型的工具類來(lái)替換枚舉更適合小白
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Spring啟動(dòng)流程refresh()源碼深入解析
這篇文章主要給大家介紹了關(guān)于Spring啟動(dòng)流程refresh()源碼深入解析的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Java實(shí)現(xiàn)自定義枚舉值校驗(yàn)器的示例代碼
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)自定義枚舉值校驗(yàn)器的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2023-02-02Spring循環(huán)依賴正確性及Bean注入的順序關(guān)系詳解
這篇文章主要給大家介紹了關(guān)于Spring循環(huán)依賴的正確性,以及Bean注入的順序關(guān)系的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01Java如何獲取List<String>中的String詳解
工作了這么長(zhǎng)時(shí)間了,一直沒(méi)有記錄的習(xí)慣,以至于導(dǎo)致我即便是查過(guò)的東西總會(huì)忘記,下面這篇文章主要給大家介紹了關(guān)于Java如何獲取List<String>中String的相關(guān)資料,需要的朋友可以參考下2022-02-02Java ArrayList與LinkedList及HashMap容器的用法區(qū)別
這篇文章主要介紹了Java ArrayList與LinkedList及HashMap容器的用法區(qū)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-07-07Java模擬QQ實(shí)現(xiàn)聊天互動(dòng)程序
這篇文章主要介紹了如何利用Java語(yǔ)言模擬QQ實(shí)現(xiàn)一個(gè)簡(jiǎn)易的聊天互動(dòng)程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-06-06Java內(nèi)部類_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
內(nèi)部類是指在一個(gè)外部類的內(nèi)部再定義一個(gè)類。下面通過(guò)本文給大家java內(nèi)部類的使用小結(jié),需要的朋友參考下吧2017-04-04