Spring異常實(shí)現(xiàn)統(tǒng)一處理的方法
1.統(tǒng)一處理異常的機(jī)制
Spring MVC框架提供了統(tǒng)一處理異常的機(jī)制!表現(xiàn)為每種類型的異常只需要寫一段(寫一次)處理此異常的代碼即可,項(xiàng)目中無論處理哪種請(qǐng)求時(shí),只要出現(xiàn)這種異常,都會(huì)自動(dòng)執(zhí)行這段代碼!
提示:當(dāng)項(xiàng)目中添加了spring-boot-starter-web
依賴項(xiàng),此依賴項(xiàng)中的核心就是Spring MVC框架的依賴項(xiàng)。
在實(shí)現(xiàn)統(tǒng)一處理異常之前,需要先使得控制器中處理請(qǐng)求的方法不再處理異常!則處理請(qǐng)求的方法表現(xiàn)為拋出異常(但并不需要從代碼中顯式的表現(xiàn)出來)!
2.關(guān)于統(tǒng)一處理異常的方法
訪問權(quán)限:應(yīng)該使用public
返回值類型:參考處理請(qǐng)求的方法方法
名稱:自定義
參數(shù)列表:至少有1個(gè)異常類型的參數(shù),表示被處理的異常,另外,可以按需添加;HttpServletRequest
、HttpServletResponse
等少量特定類型的參數(shù),不可以隨意添加其它;參數(shù),例如不可以添加HttpSession
等,如果有多個(gè)參數(shù),各參數(shù)可以不區(qū)分先后順序;
注解:必須添加@ExceptionHandler
,表示此方法是處理異常的方法。
@ExceptionHandler public String handleServiceException(ServiceException e) { return e.getMessage(); }
3.關(guān)于處理異常的方法的執(zhí)行特點(diǎn)
允許同時(shí)存在多個(gè)處理異常的方法,只要這些方法處理的異常不完全相同即可;
多個(gè)處理異常的方法,其處理的異常類型允許存在繼承關(guān)系;
- 例如某方法處理
NullPointerException
,另一個(gè)方法處理RuntimeException
,是正確的; - 當(dāng)出現(xiàn)子級(jí)異常時(shí),將執(zhí)行處理子級(jí)異常的方法;
如果將處理異常的方法定義在控制器類中,則這些方法只能作用于當(dāng)前控制器類中處理的請(qǐng)求;
可以自定義類,在類上添加@RestControllerAdvice
注解,將處理異常的方法聲明在這個(gè)類中,可以作用于當(dāng)前項(xiàng)目中所有處理請(qǐng)求時(shí)方法。
則在項(xiàng)目的根包下創(chuàng)建ex.handler.GlobalExceptionHandler
類,在類上添中@RestControllerAdvice
注解,并在此類中處理異常(在任何控制器類中都不再處理異常):
package cn.tedu.csmall.product.ex.handler; import cn.tedu.csmall.product.ex.ServiceException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler public String handleServiceException(ServiceException e) { return e.getMessage(); } @ExceptionHandler public String handleNullPointerException(NullPointerException e) { return "程序出現(xiàn)了空指針異常,已經(jīng)被處理!"; } @ExceptionHandler public String handleRuntimeException(RuntimeException e) { return "程序出現(xiàn)了RuntimeException,已經(jīng)被處理!"; } }
User login(String username, String password) throws 用戶名不存在異常, 密碼錯(cuò)誤異常, 賬號(hào)非法狀態(tài)異常……
// boolean:表示登錄成功,或登錄失敗
// 但是,無法表示哪種失敗
// int:使用某個(gè)數(shù)據(jù)表示某種狀態(tài),例如1表示登錄成功,2表示用戶名錯(cuò),3表示密碼錯(cuò),4表示封號(hào),等等
// 但是,無法返回登錄成功的結(jié)果
try { User user = service.login("root", "1234"); // 將User對(duì)象保存到Session中 } catch (用戶名不存在異常 e) { } catch (密碼錯(cuò)誤異常 e) { } catch (賬號(hào)非法狀態(tài)異常 e) { }
到此這篇關(guān)于Spring異常實(shí)現(xiàn)統(tǒng)一處理的方法的文章就介紹到這了,更多相關(guān)Spring異常處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中字符串和byte數(shù)組之間的簡(jiǎn)單轉(zhuǎn)換方法
這篇文章主要給大家介紹了關(guān)于Java中字符串和byte數(shù)組之間的簡(jiǎn)單轉(zhuǎn)換方法,Java中將String類型轉(zhuǎn)換為byte[]類型,可以使用String的getBytes()方法,還有很多其他的辦法,需要的朋友可以參考下2023-08-08SpringMVC中的HttpServletRequestWrapper使用解析
這篇文章主要介紹了SpringMVC中的HttpServletRequestWrapper使用解析,HttpServletRequestWrapper 采用裝飾者模式對(duì)HttpServletRequest進(jìn)行包裝,我們可以通過繼承HttpServletRequestWrapper類去重寫getParameterValues,getParameter等方法,需要的朋友可以參考下2024-01-01詳談ThreadLocal-單例模式下高并發(fā)線程安全
這篇文章主要介紹了ThreadLocal-單例模式下高并發(fā)線程安全,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Java與WebUploader相結(jié)合實(shí)現(xiàn)文件上傳功能(實(shí)例代碼)
這篇文章主要介紹了Java結(jié)合WebUploader實(shí)現(xiàn)文件上傳功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03