亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java實(shí)現(xiàn)統(tǒng)一異常處理的示例

 更新時(shí)間:2021年06月19日 14:14:11   作者:迷路人~  
一個(gè)全局異常處理類需要處理三類異常1.業(yè)務(wù)類異常,2.運(yùn)行時(shí)異常 ,3.Error,本文給大家介紹java實(shí)現(xiàn)統(tǒng)一異常處理的示例,感興趣的朋友一起看看吧

對(duì)于Dao層 和Service產(chǎn)生的異常要一直網(wǎng)上拋,直至Controller層,但是對(duì)于controller層不能處理的異常也不能直接拋給前端。

為什么不能在service處理異常?

答:Service 層往往涉及數(shù)據(jù)庫(kù)事務(wù),出現(xiàn)異常同樣不適合捕獲,否則事務(wù)無(wú)法自動(dòng)回滾。此外 Service 層涉及業(yè)務(wù)邏輯,有些業(yè)務(wù)邏輯執(zhí)行中遇到業(yè)務(wù)異常,可能需要在異常后轉(zhuǎn)入分支業(yè)務(wù)流程。如果業(yè)務(wù)異常都被框架捕獲了,業(yè)務(wù)功能就會(huì)不正常?!?strong>引用:極客時(shí)間的Java業(yè)務(wù)開發(fā)常見錯(cuò)誤100例】

實(shí)現(xiàn)統(tǒng)一異常處理:

在spring框架下實(shí)現(xiàn)一個(gè)異常處理的類,用 @RestControllerAdvice + @ExceptionHandler

進(jìn)行修飾:

即@RestControllerAdvice默認(rèn)會(huì)攔截 controller類上拋出的不能處理的異常

一個(gè)全局異常處理類需要處理三類異常: 1.業(yè)務(wù)類異常,2.運(yùn)行時(shí)異常 ,3.Error

1.運(yùn)行時(shí)異常

/**
 * @創(chuàng)建人: liup
 * @創(chuàng)建時(shí)間: 2021/6/18
 * @描述   全局異常捕獲處理類
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
 
    
    /**
    * @Author:  liup
    * @date:  2021/6/18 14:34
      方法實(shí)現(xiàn)說(shuō)明:  攔截運(yùn)行時(shí)異常
    */
    @ExceptionHandler(value = RuntimeException.class)
    public R runtimeExceptionHandle(RuntimeException e){
        log.error("捕捉到運(yùn)行時(shí)異常",e);
        return R.failed("未知錯(cuò)誤");
    }
}

目前僅是攔截運(yùn)行時(shí)異常

R 是返回的消息體:

那如果不使用GlobalExceptionHandler,會(huì)報(bào)出什么錯(cuò)誤呢?

這個(gè)錯(cuò)誤是在service層拋出的,當(dāng)從redis 通過(guò)key獲取一個(gè)已刪除的value時(shí),redis返回的是null,但是我沒有判斷這個(gè)value是否為null,就將其打印出來(lái):

log.info(authInfoVo.toString());

注意:這是要返回給前端的,msg的內(nèi)容,是對(duì)用戶十分不友好的。

2.Error

RuntimeException只是異常中的一個(gè)類,不能包含所有的異常體系,還有一大類是叫Error(系統(tǒng)級(jí)異常),所以需要有一個(gè)兜底的異常捕獲:

/**
    * @Author:  liup
    * @date:  2021/6/18 15:01
      方法實(shí)現(xiàn)說(shuō)明: 捕獲系統(tǒng)級(jí)異常
    */
    @ExceptionHandler(value = Throwable.class)
    public R  throwableHandle(Throwable th){
        log.error("捕捉到Throwable異常",th);
        return R.failed("系統(tǒng)異常");
    }

和上面那個(gè)運(yùn)行時(shí)異常同時(shí)存在 。

3.業(yè)務(wù)類異常

【自己定義的異常】

首先創(chuàng)建業(yè)務(wù)異常類

/**
 * @創(chuàng)建人: liup
 * @創(chuàng)建時(shí)間: 2021/6/18
 * @描述  業(yè)務(wù)類異常
 */
public class BusinessException extends RuntimeException{
 
      @Getter
       private final String code;
 
      /**
      * @Author:  liup
      * @date:  2021/6/18 15:10
        方法實(shí)現(xiàn)說(shuō)明:  根據(jù)消息碼【可用枚舉類】 構(gòu)造業(yè)務(wù)類異常
      */
    public BusinessException(String code) {
        this.code = code;
    }
 
    /**
    * @Author:  liup
    * @date:  2021/6/18 15:08
      方法實(shí)現(xiàn)說(shuō)明:  自定義消息體構(gòu)造業(yè)務(wù)類異常
    */
    public BusinessException(String code,String message) {
        super(message);
        this.code = code;
    }
 
    /**
    * @Author:  liup
    * @date:  2021/6/18 15:09
      方法實(shí)現(xiàn)說(shuō)明:  根據(jù)異常 構(gòu)造業(yè)務(wù)類異常
    */
    public BusinessException(String code,Throwable cause) {
        super(cause);
        this.code = code;
    }
 
}

三種異常攔截同時(shí)存在;

/**
 * @創(chuàng)建人: liup
 * @創(chuàng)建時(shí)間: 2021/6/18
 * @描述   全局異常捕獲處理類
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
 
 
    /**
    * @Author:  liup
    * @date:  2021/6/18 15:14
      方法實(shí)現(xiàn)說(shuō)明:  攔截業(yè)務(wù)類異常
    */
    @ExceptionHandler(value = BusinessException.class)
    public R businessExceptionHandle(BusinessException e){
 
        log.error("捕獲業(yè)務(wù)類異常:",e);
        return R.failed("業(yè)務(wù)類異常:"+e.getMessage());
    }
 
 
    /**
    * @Author:  liup
    * @date:  2021/6/18 14:34
      方法實(shí)現(xiàn)說(shuō)明:  攔截運(yùn)行時(shí)異常
//    */
    @ExceptionHandler(value = RuntimeException.class)
    public R runtimeExceptionHandle(RuntimeException e){
        log.error("捕捉到運(yùn)行時(shí)異常",e);
        return R.failed("未知錯(cuò)誤:");
    }
 
    /**
    * @Author:  liup
    * @date:  2021/6/18 15:01
      方法實(shí)現(xiàn)說(shuō)明: 捕獲系統(tǒng)級(jí)異常
    */
    @ExceptionHandler(value = Throwable.class)
    public R  throwableHandle(Throwable th){
        log.error("捕捉到Throwable異常",th);
        return R.failed("系統(tǒng)異常");
    }
}

4.對(duì)服務(wù)器友好:

以上是對(duì)前端友好,但是在服務(wù)器上,不是容易定位錯(cuò)誤,

但是若是在參數(shù)上添加上HttpServletRequest req, HandlerMethod method,就很容易定位到錯(cuò)誤

 private static int GENERIC_SERVER_ERROR_CODE = 2000;
    private static String GENERIC_SERVER_ERROR_MESSAGE = "服務(wù)器忙,請(qǐng)稍后再試";
 
    @ExceptionHandler
    public R handle(HttpServletRequest req, HandlerMethod method, Exception ex) {
        if (ex instanceof BusinessException) {
            BusinessException exception = (BusinessException) ex;
            log.warn(String.format("訪問(wèn) %s -> %s 出現(xiàn)業(yè)務(wù)異常!", req.getRequestURI(), method.toString()), ex);
            return R.failed(GENERIC_SERVER_ERROR_MESSAGE);
        } else if (ex instanceof RuntimeException){
            log.error(String.format("訪問(wèn) %s -> %s 出現(xiàn)運(yùn)行時(shí)異常!", req.getRequestURI(), method.toString()), ex);
            return R.failed(GENERIC_SERVER_ERROR_MESSAGE);
        }
 
        else {
            log.error(String.format("訪問(wèn) %s -> %s 出現(xiàn)系統(tǒng)異常!", req.getRequestURI(), method.toString()), ex);
            return R.failed(GENERIC_SERVER_ERROR_MESSAGE);
        }
    }

到此這篇關(guān)于java實(shí)現(xiàn)統(tǒng)一異常處理的文章就介紹到這了,更多相關(guān)java異常處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springcloud nacos的賦值均衡和動(dòng)態(tài)刷新

    springcloud nacos的賦值均衡和動(dòng)態(tài)刷新

    nacos是一個(gè)分布式的配置中心和注冊(cè)發(fā)現(xiàn)中心,這篇文章主要介紹了springcloud nacos的賦值均衡和動(dòng)態(tài)刷新,需要的朋友可以參考下
    2024-05-05
  • Java實(shí)現(xiàn)連連看算法

    Java實(shí)現(xiàn)連連看算法

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)連連看算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 關(guān)于java的九個(gè)預(yù)定義Class對(duì)象

    關(guān)于java的九個(gè)預(yù)定義Class對(duì)象

    這篇文章主要介紹了關(guān)于java的九個(gè)預(yù)定義Class對(duì)象,在Java中,沒有類就無(wú)法做任何事情。然而,并不是所有的類都具有面向?qū)ο筇卣?。如Math.random,并只需要知道方法名和參數(shù),需要的朋友可以參考下
    2023-05-05
  • Spring中@Value注解詳細(xì)圖文講解

    Spring中@Value注解詳細(xì)圖文講解

    在spring中有兩種注入方式一種是XML文件注入,另一種則是注解注入,這篇文章主要給大家介紹了關(guān)于Spring中@Value注解的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • 基于springboot2集成jpa,創(chuàng)建dao的案例

    基于springboot2集成jpa,創(chuàng)建dao的案例

    這篇文章主要介紹了基于springboot2集成jpa,創(chuàng)建dao的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • SpringBoot配置Redis自定義過(guò)期時(shí)間操作

    SpringBoot配置Redis自定義過(guò)期時(shí)間操作

    這篇文章主要介紹了SpringBoot配置Redis自定義過(guò)期時(shí)間操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java實(shí)現(xiàn)網(wǎng)頁(yè)驗(yàn)證碼功能

    java實(shí)現(xiàn)網(wǎng)頁(yè)驗(yàn)證碼功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)網(wǎng)頁(yè)驗(yàn)證碼功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • IDEA內(nèi)存調(diào)試插件(好用)

    IDEA內(nèi)存調(diào)試插件(好用)

    本文給大家分享IDEA中一個(gè)很有用的內(nèi)存調(diào)試插件,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下
    2018-02-02
  • Java 數(shù)組差集實(shí)例代碼

    Java 數(shù)組差集實(shí)例代碼

    這篇文章主要介紹了Java 數(shù)組差集實(shí)例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 如何利用泛型封裝通用的service層

    如何利用泛型封裝通用的service層

    這篇文章主要介紹了如何利用泛型封裝通用的service層,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評(píng)論