摘要:為了貼合主題,本次主要針對全局異常處理進行舉例說明。自定義異常處理自定義一個異常自定義異常程序員小明錯誤碼錯誤信息顯而易見,這個異常繼承了,屬于運行時異常。包括處理其他異常,都是這種方式。
之前用springboot的時候,只知道捕獲異常使用try{}catch,一個接口一個try{}catch,這也是大多數(shù)開發(fā)人員異常處理的常用方式,雖然屢試不爽,但會造成一個問題,就是一個Controller下面,滿屏幕的try{}catch,看著一點都不優(yōu)雅,一點都不符合小明的氣質(zhì),憋了這么久,小明今天終于決定對所有異常實施統(tǒng)一處理的方案。開發(fā)準(zhǔn)備
JDK8、正常的springboot項目
代碼編寫 通用異常處理其實Spring系列的項目全局異常處理方式早已存在,只不過我們一直忙于搬磚,很少停下腳步去審視這個日夜與我們相伴的朋友。為了貼合主題,本次主要針對SpringBoot全局異常處理進行舉例說明。
SpringBoot中有一個@ControllerAdvice的注解,使用該注解即表示開啟全局異常捕獲,接下來我們只需在自定義的方法上使用@ExceptionHandler注解,并定義捕獲異常的類型,對這種類型的異常進行統(tǒng)一的處理。
舉個例子:
假如我們需要針對NullException(空指針異常,是Java程序員最痛恨的異常,沒有之一)進行全局處理(如下所示)。
@RestControllerAdvice public class GlobalExceptionHandler { /** * 處理空指針的異常 * @param req * @param e * @return */ @ExceptionHandler(value =NullPointerException.class) public BaseResponseFacade exceptionHandler(HttpServletRequest req, NullPointerException e){ log.error("發(fā)生空指針異常!原因是:",e); return ResponseUtil.error(ResponseCode.ERROR); } }
訥,就這么簡單。其他可能發(fā)生的異常,都可以以這種方式處理快速處理。此處大家應(yīng)該表現(xiàn)的十分興奮,但請不要高興太早,因為接下來,有更令激動人心的事情。
自定義異常處理import lombok.AllArgsConstructor; import lombok.Data; import lombok.experimental.Accessors; /** * @Description 自定義異常 * @Date 2019-08-05 15:49 * @Created by 程序員小明 */ @Data @AllArgsConstructor @Accessors(chain = true) public class BizException extends RuntimeException { /** * 錯誤碼 */ protected Integer errorCode; /** * 錯誤信息 */ protected String errorMsg; }
顯而易見,這個異常繼承了RuntimeException,屬于運行時異常。細心的朋友已經(jīng)發(fā)現(xiàn),我使用了Lombok插件,非常契合今天的主題,給大家簡單介紹一下:
lombok是一個可以幫助我們簡化java代碼編寫的工具類,尤其是簡化javabean的編寫,即通過采用注解的方式,消除代碼中的構(gòu)造方法,getter/setter等代碼,使我們寫的類更加簡潔(如果使用的IDE是idea,需要安裝插件哈)。
定義過之后,我們就可以和之前處理NullException方式一樣處理我們自定義的異常。包括處理其他異常,都是這種方式。直接貼代碼。
@Slf4j @RestControllerAdvice public class GlobalExceptionHandler { /** * 處理自定義的業(yè)務(wù)異常 * @param req * @param e * @return */ @ExceptionHandler(value = BizException.class) public BaseResponseFacade bizExceptionHandler(HttpServletRequest req, BizException e){ log.error("發(fā)生業(yè)務(wù)異常!原因是:{}",e.getErrorMsg()); return ResponseUtil.error(e.getErrorCode(),e.getErrorMsg()); } /** * 處理空指針的異常 * @param req * @param e * @return */ @ExceptionHandler(value =NullPointerException.class) public BaseResponseFacade exceptionHandler(HttpServletRequest req, NullPointerException e){ log.error("發(fā)生空指針異常!原因是:",e); return ResponseUtil.error(ResponseCode.ERROR); } /** * 處理其他異常 * @param req * @param e * @return */ @ExceptionHandler(value =Exception.class) public BaseResponseFacade exceptionHandler(HttpServletRequest req, Exception e){ log.error("未知異常!原因是:",e); return ResponseUtil.error(ResponseCode.INTERNAL_SERVER_ERROR); } }
整個全局異常處理方式核心就是以上介紹這些。下面用一個Demo給大家舉個例子
@GetMapping("/test") public BaseResponseFacade test(){ if(true){ throw new BizException(1,"error"); } return ResponseUtil.success(); }
地址欄請求,進入這個方法后,會拋出異常,此時全局異常生效,就會返回異常處理過后的信息
{"errorCode":1,"errorMsg":"error","data":null}
到此整個流程都然跑通了。當(dāng)然,好多地方都可以根據(jù)我們自身實際業(yè)務(wù)情況以此為基礎(chǔ)進一步豐富,比如返回數(shù)據(jù)可以改成跳轉(zhuǎn)某一個具體的頁面。這樣的出場方式是不是都很優(yōu)雅?大家有什么問題,期待各位留言。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/76005.html
摘要:還提供了全部參數(shù)的構(gòu)造函數(shù)的自動生成,該注解的作用域也是只有在實體類上,因為只有實體類才會存在構(gòu)造函數(shù)。當(dāng)然除了全部參數(shù)的構(gòu)造函數(shù),還提供了沒有參數(shù)的構(gòu)造函數(shù),使用方式與一致。 Lombok對于Java偷懶開發(fā)者來說應(yīng)該是比較中意的,恰恰筆者就是一個喜歡在小細節(jié)上偷懶來提高開發(fā)效率的人。所以在技術(shù)框架的海洋里尋找了很久才在GitHub開源平臺上找到,而在這之前國外很多程序猿一直使用該框...
摘要:和的區(qū)別方法注解作用于級別注解為一個定義一個異常處理器類注解作用于整個工程注解定義了一個全局的異常處理器需要注意的是的優(yōu)先級比高即拋出的異常如果既可以讓標(biāo)注的方法處理又可以讓標(biāo)注的類中的方法處理則優(yōu)先讓標(biāo)注的方法處理處理中的異常為了方便地展 @ControllerAdvice 和 @ExceptionHandler 的區(qū)別 ExceptionHandler, 方法注解, 作用于 Co...
摘要:除了,還有十余種,有的是特定操作,比如轉(zhuǎn)儲內(nèi)存日志有的是信息展示,比如顯示應(yīng)用健康狀態(tài)。 showImg(http://ww1.sinaimg.cn/large/006tNc79gy1g5qb2coyfoj30u00k0tan.jpg); 前言 隨著線上應(yīng)用逐步采用 SpringBoot 構(gòu)建,SpringBoot應(yīng)用實例越來多,當(dāng)線上某個應(yīng)用需要升級部署時,常常簡單粗暴地使用 kil...
摘要:挺多人咨詢的,異常處理用切面注解去實現(xiàn)去全局異常處理。全局異常處理類,代碼如下代碼解析如下抽象類是用來處理全局錯誤時進行擴展和實現(xiàn)注解標(biāo)記的切面排序,值越小擁有越高的優(yōu)先級,這里設(shè)置優(yōu)先級偏高。 本文內(nèi)容 為什么要全局異常處理? WebFlux REST 全局異常處理實戰(zhàn) 小結(jié) 摘錄:只有不斷培養(yǎng)好習(xí)慣,同時不斷打破壞習(xí)慣,我們的行為舉止才能夠自始至終都是正確的。 一、為什么要全局...
摘要:新建字典必要的驗證參數(shù)不能為空調(diào)用封裝數(shù)據(jù)到統(tǒng)一到結(jié)構(gòu)體異常處理包括中拋出到自定義異常和未知異常統(tǒng)一包裝到返回對象中這樣子的代碼在開發(fā)接口的時候比比皆是。 基礎(chǔ)知識 在開始之前 假設(shè)你從未了解過函數(shù)式編程,本文不會教你函數(shù)式里面的各種概念。而是用實際案例讓給了解到函數(shù)式編程的魅力,并且能夠在合適的場景中應(yīng)用。 ## 重構(gòu)之前 基本代碼如下 很普通的 springboot http接口。...
閱讀 2074·2021-11-15 17:57
閱讀 739·2021-11-11 16:54
閱讀 2589·2021-09-27 13:58
閱讀 4067·2021-09-06 15:00
閱讀 950·2021-09-04 16:45
閱讀 3505·2019-08-30 15:56
閱讀 1784·2019-08-30 15:53
閱讀 1604·2019-08-30 14:12