本篇內(nèi)容主要講解“ java后端項(xiàng)目異常的處理方法”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“ java后端項(xiàng)目異常的處理方法”吧!
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、成都小程序開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了長(zhǎng)海免費(fèi)建站歡迎大家使用!
這種異常處理只局部于某個(gè)Controller內(nèi),如:
@Controller @Slf4j @RequestMapping("/api/demo") public class DemoController { @ExceptionHandler(Exception.class) @ResponseBody public ResponseDTO<?> exceptionHandler(Exception e) { log.error("[{}] system error", e); return ResponseDTO.builder() .errorCode(ErrorCode.SYSTEM_ERROR) .build(); } }
所有Controller方法(即被RequestMapping注解的方法)拋出的異常,會(huì)被該異常處理方法處理。
使用上,在Controller內(nèi)部,用@ExceptionHandler注解的方法,就會(huì)作為該Controller內(nèi)部的異常處理方法。
并且,它的參數(shù)中可以注入如WebRequest、NativeWebRequest等,用來(lái)拿到請(qǐng)求相關(guān)的數(shù)據(jù)。
它可以返回String代表一個(gè)view名稱,也可以返回一個(gè)對(duì)象并且用@ResponseBody修飾,由框架的其它機(jī)制幫你序列化。
此外,它還能夠?qū)Ξ惓n愋瓦M(jìn)行細(xì)粒度的控制,通過(guò)注解可以有選擇的指定異常處理方法應(yīng)用的異常類型:
@ExceptionHandler({BusinessException.class, DataBaseError.class })
雖然說(shuō)全局異常處理HandlerExceptionResolver通過(guò)條件判斷也能做到, 但是使用這種注解方式明顯更具有可讀性。
剛才介紹的是Controller局部的異常處理,用于處理該Controller內(nèi)部的特有的異常處理十分有用。
首先,定義一個(gè)存放異常處理函數(shù)的類,并使用@ControllerAdvice修飾。
@ControllerAdvice(assignableTypes = {GlobalExceptionHandlerMixin.class}) public class ExceptionAdvice { @ExceptionHandler(ErrorCodeWrapperException.class) @ResponseBody public ResponseDTO<?> exceptionHandler(ErrorCodeWrapperException e) { if ((errCodeException.getErrorCode().equals(ErrorCode.SYSTEM_ERROR))) { log.error(e); } return ResponseDTO.ofErroCodeWrapperException(errCodeException); } }
@ExceptionHanlder修飾的方法的寫(xiě)法和Controller內(nèi)的異常處理函數(shù)寫(xiě)法是一樣的。
注意到,我是這樣編寫(xiě)注解的:
@ControllerAdvice(assignableTypes = {GlobalExceptionHandlerMixin.class})
它用來(lái)限定這些異常處理函數(shù)起作用的Controller的范圍。如果不寫(xiě),則默認(rèn)對(duì)所有Controller有效。
這也是ControllerAdvice進(jìn)行統(tǒng)一異常處理的優(yōu)點(diǎn),它能夠細(xì)粒度的控制該異常處理器針對(duì)哪些Controller有效,這樣的好處是:
一個(gè)系統(tǒng)里就能夠存在不同的異常處理器,Controller也可以有選擇的決定使用哪個(gè),更加靈活。
不同的業(yè)務(wù)模塊可能對(duì)異常處理的方式不同,通過(guò)該機(jī)制就能做到。
設(shè)想一個(gè)一開(kāi)始并未使用全局異常處理的系統(tǒng),如果直接引入全局范圍內(nèi)生效的全局異常處理,勢(shì)必可能會(huì)改變已有Controller的行為,有侵入性。也就是說(shuō),如果不控制生效范圍,即默認(rèn)對(duì)所有Controller生效。如果控制生效范圍,則默認(rèn)對(duì)所有Controller不生效,降低侵入性。
如剛才示例中的例子,只針對(duì)實(shí)現(xiàn)了GlobalExceptionHandlerMixin接口的類有效:
@Controller @Slf4j @RequestMapping("/api/demo") public class DemoController implements GlobalExceptionHandlerMixin { }
ControllerAdvice支持的限定范圍:
按注解:@ControllerAdvice(annotations = RestController.class)
按包名:@ControllerAdvice("org.example.controllers")
按類型:@ControllerAdvice(assignableTypes = {ControllerInterface.class, AbstractController.class})
以上幾種方式是Spring專門(mén)為異常處理設(shè)計(jì)的機(jī)制。
就我個(gè)人而言,由于ControllerAdvice具有更細(xì)粒度的控制能力,所以我更偏愛(ài)于在系統(tǒng)中使用ControllerAdvice進(jìn)行統(tǒng)一異常處理。
除了用異常來(lái)傳遞系統(tǒng)中的意外錯(cuò)誤,也會(huì)用它來(lái)傳遞處于接口行為一部分的業(yè)務(wù)錯(cuò)誤。
這也是異常的優(yōu)點(diǎn)之一,如果接口的實(shí)現(xiàn)比較復(fù)雜,分多層函數(shù)實(shí)現(xiàn),如果直接傳遞錯(cuò)誤碼,那么到Controller的路徑上的每一層函數(shù)都需要檢查錯(cuò)誤碼,退回到了C語(yǔ)言那種可怕的“寫(xiě)一行語(yǔ)句檢查一下錯(cuò)誤碼”的模式。
當(dāng)然,理論上,任何能夠給Controller加切面的機(jī)制都能變相的進(jìn)行統(tǒng)一異常處理。比如:
在攔截器內(nèi)捕獲Controller的異常,做統(tǒng)一異常處理。
使用Spring的AOP機(jī)制,做統(tǒng)一異常處理。
到此,相信大家對(duì)“ java后端項(xiàng)目異常的處理方法”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
網(wǎng)頁(yè)標(biāo)題:java后端項(xiàng)目異常的處理方法
文章地址:http://www.rwnh.cn/article30/ipciso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、網(wǎng)站制作、服務(wù)器托管、微信小程序、云服務(wù)器、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)