spring-boot中異常的處理
使用spring-boot開發(fā)過程中,調(diào)用接口時(shí)常遇到各種報(bào)錯(cuò)問題,如果項(xiàng)目一開始沒有做完整的異常架構(gòu)設(shè)計(jì),那么對(duì)于問題排查起來就很是耗費(fèi)時(shí)間。我們可以通過spring提供的異常捕獲機(jī)制,在項(xiàng)目架構(gòu)設(shè)計(jì)階段就做好各種異常的判斷,包括日志記錄,詳細(xì)的堆棧信息等,統(tǒng)一http響應(yīng)的報(bào)文格式返回給前端,這樣既能避免泄露私密信息以及公司所用的技術(shù)棧,又方便我們排查問題~
關(guān)于異常處理的spring官方文檔說明:https://docs.spring.io/spring-framework/docs/5.3.6/reference/html/web.html#mvc-ann-exceptionhandler
下面來看下在spring-boot中兩種主要的異常處理方式
局部異常的處理
通過@ExceptionHandler
注解標(biāo)記在Controller
的方法中,來做Controller范圍內(nèi)的異常捕獲處理
ExceptionHandler詳細(xì)方法參數(shù)說明:https://docs.spring.io/spring-framework/docs/5.3.6/reference/html/web.html#mvc-ann-exceptionhandler-args
示例代碼:https://github.com/netbuffer/spring-boot-demo/blob/master/src/main/java/cn/netbuffer/springboot/demo/controller/RaiseExceptionTestController.java
啟動(dòng)工程,訪問測試接口來引發(fā)一個(gè)類型轉(zhuǎn)換錯(cuò)誤測試
GET /raise/exception/test/long?id=abc

此時(shí)可以看到已經(jīng)按照我們異常處理器中封裝的報(bào)文格式返回響應(yīng)了
全局異常的處理
spring中可以通過@ControllerAdvice
注解來攔截所有Controller,這時(shí)就可以將@ExceptionHandler方法聲明寫到這里,來實(shí)現(xiàn)全局的異常處理了
spring關(guān)于ControllerAdvice的詳細(xì)使用說明:https://docs.spring.io/spring-framework/docs/5.3.6/reference/html/web.html#mvc-ann-controller-advice
示例代碼:https://github.com/netbuffer/spring-boot-demo/blob/master/src/main/java/cn/netbuffer/springboot/demo/controller/CustomControllerAdvice.java
注意先注釋局部異常處理器,再訪問接口引發(fā)異常來測試下結(jié)果,屏蔽局部異常處理器的干擾

可以看到我們的全局異常處理器已經(jīng)生效了

那么局部異常處理器和全局異常處理器同時(shí)存在的時(shí)候會(huì)是什么樣的結(jié)果呢?通過我實(shí)際測試發(fā)現(xiàn),局部異常處理器優(yōu)先級(jí)會(huì)高于全局異常處理器,也就是說,當(dāng)兩者同時(shí)存在的時(shí)候,只會(huì)執(zhí)行局部的異常處理邏輯~
最后要說下,spring官方建議在使用全局異常處理的時(shí)候,通過繼承ResponseEntityExceptionHandler
,來按照需要重寫對(duì)應(yīng)的方法,大部分http相關(guān)異常情況ResponseEntityExceptionHandler已經(jīng)幫我們處理的很好了

ResponseEntityExceptionHandler的官方說明:https://docs.spring.io/spring-framework/docs/5.3.6/javadoc-api/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandler.html
示例代碼:
ResponseEntityExceptionHandler相關(guān)http接口調(diào)用異常處理方法
