内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

java后端項(xiàng)目異常的處理方法

本篇內(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)建站歡迎大家使用!

一、Controller局部異常處理

1.1. 使用示例

這種異常處理只局部于某個(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ò)條件判斷也能做到, 但是使用這種注解方式明顯更具有可讀性。

二、ControllerAdvice

2.1 使用示例

剛才介紹的是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ě)法是一樣的。

2.2 控制生效的Controller范圍

注意到,我是這樣編寫(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})

三、總結(jié)

以上幾種方式是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)

小程序開(kāi)發(fā)
财经| 武平县| 台山市| 隆化县| 崇信县| 乌拉特中旗| 宝山区| 和静县| 扶沟县| 琼海市| 正定县| 民勤县| 富平县| 贡山| 清苑县| 洛扎县| 新河县| 邵武市| 芦溪县| 文山县| 邮箱| 株洲市| 甘谷县| 高州市| 迁西县| 梅州市| 镇宁| 堆龙德庆县| 奎屯市| 河津市| 阿拉善盟| 苍梧县| 贵溪市| 仁怀市| 麦盖提县| 大足县| 廊坊市| 凤山县| 新乡县| 昌吉市| 杂多县|