色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何優(yōu)雅的處理異常 Java語(yǔ)言異常分析

京東云 ? 來(lái)源:jf_75140285 ? 作者:jf_75140285 ? 2024-09-06 11:59 ? 次閱讀

一、什么是異常

Java 語(yǔ)言按照錯(cuò)誤嚴(yán)重性,從 throwale 根類衍生出 Error 和 Exception 兩大派系。

Error(錯(cuò)誤):

程序在執(zhí)行過(guò)程中所遇到的硬件或操作系統(tǒng)的錯(cuò)誤。錯(cuò)誤對(duì)程序而言是致命的,將導(dǎo)致程序無(wú)法運(yùn)行。常見的錯(cuò)誤有內(nèi)存溢出,jvm 虛擬機(jī)自身的非正常運(yùn)行,calss 文件沒有主方法。程序本生是不能處理錯(cuò)誤的,只能依靠外界干預(yù)。Error 是系統(tǒng)內(nèi)部的錯(cuò)誤,由 jvm 拋出,交給系統(tǒng)來(lái)處理。

Exception(異常):

程序正常運(yùn)行中,可以預(yù)料的意外情況。比如數(shù)據(jù)庫(kù)連接中斷,空指針,數(shù)組下標(biāo)越界。異常出現(xiàn)可以導(dǎo)致程序非正常終止,也可以預(yù)先檢測(cè),被捕獲處理掉,使程序繼續(xù)運(yùn)行。Exception(異常)按照性質(zhì),又分為編譯異常(受檢異常)和運(yùn)行時(shí)異常(非受檢異常)。

?編譯異常:

又叫可檢查異常,通常時(shí)由語(yǔ)法錯(cuò)和環(huán)境因素(外部資源)造成的異常。比如輸入輸出異常 IOException,數(shù)據(jù)庫(kù)操作 SQLException。其特點(diǎn)是,Java 語(yǔ)言強(qiáng)制要求捕獲和處理所有非運(yùn)行時(shí)異常。通過(guò)行為規(guī)范,強(qiáng)化程序的健壯性和安全性。

?運(yùn)行時(shí)異常:

又叫不檢查異常 RuntimeException,這些異常一般是由程序邏輯錯(cuò)誤引起的,即語(yǔ)義錯(cuò)。比如算術(shù)異常,空指針異常 NullPointerException,下標(biāo)越界 IndexOutOfBoundsException。運(yùn)行時(shí)異常應(yīng)該在程序測(cè)試期間被暴露出來(lái),由程序員去調(diào)試,而避免捕獲。

二、處理異常方式

代碼中,我們最常見到的處理異常的方式就是:try-catch

        try {
            // 業(yè)務(wù)邏輯
            
        } catch (Exception e) {
            // 捕獲到異常的邏輯
        }

或者是再進(jìn)一步區(qū)分下異常類型:

        try {
            // 業(yè)務(wù)邏輯
            
        } catch (IOException ie) {
            // 捕獲到IO異常的邏輯
            
        } catch (Exception e) {
            // 捕獲到其他異常的邏輯
        }

三、如何拋出異常

我們通??梢杂脪伋霎惓5姆绞絹?lái)控制代碼流程,然后在網(wǎng)關(guān)處統(tǒng)一catch異常來(lái)返回錯(cuò)誤code。這在一定程度上可以簡(jiǎn)化代碼流程控制,如下所示:

    @Override
    public UserVO queryUser(Long id) {
        UserDO userDO = userMapper.queryUserById(id);
        if (Objects.isNull(userDO)) {
            throw new RuntimeException("用戶不存在");    //用戶不存在拋出異常
        }
        return userDO.toVo();
    }  

上面這種拋出異常的方式,雖然簡(jiǎn)化了代碼流程,但是在存在多種錯(cuò)誤場(chǎng)景時(shí),沒有辦法細(xì)分具體的錯(cuò)誤類型。如:用戶不存在的錯(cuò)誤、用戶沒有權(quán)限的錯(cuò)誤;

聰明如你,一定想到了自定義異常,如下:

    @Override
    public UserVO queryUser(Long id) {
        UserDO userDO = userMapper.queryUserById(id);
        if (Objects.isNull(userDO)) {
            throw new UserNotFoundException();    //用戶不存在拋出對(duì)應(yīng)異常
        }
        if(!checkLicence(userDO)) {
            throw new BadLicenceException();    //用戶無(wú)權(quán)限拋出對(duì)應(yīng)異常
        }
        return userDO.toVo();
    }

確實(shí),自定義異??梢越鉀Q錯(cuò)誤場(chǎng)景細(xì)分的問(wèn)題。進(jìn)一步的,我們可以對(duì)系統(tǒng)流程不同階段、不同業(yè)務(wù)類型分別自定義異常,但這需要自定義大量的異常;

四、如何優(yōu)雅的拋出異常

上面的方式,可以區(qū)分出錯(cuò)誤場(chǎng)景了,但是還存在一些缺點(diǎn)。如:可讀性差、需要定義大量的自定義異常;

那我們下面就去優(yōu)化上面的問(wèn)題;

用斷言增加代碼的可讀性;

    @Override
    public UserVO queryUser(Long id) {
        UserDO userDO = userMapper.queryUserById(id);
        Assert.notNull(userDO, "用戶不存在");    //用斷言進(jìn)行參數(shù)的非空校驗(yàn)
        return userDO.toVo();
    }

斷言雖然代碼簡(jiǎn)潔、可讀性好,但是缺乏像上述自定義異常一樣可以明確區(qū)分錯(cuò)誤場(chǎng)景,這就引出我們的究極方案:自定義斷言;

自定義斷言;

我們用自定義斷言的方式,綜合上面自定義異常和斷言的優(yōu)點(diǎn),在斷言失敗后,拋出我們制定好的異常。代碼如下:

?自定義異?;绢?/p>

@Getter
@Setter
public class BaseException extends RuntimeException {

    // 響應(yīng)碼
    private IResponseEnum responseEnum;

    // 參數(shù)信息
    private Object[] objs;

    public BaseException(String message, IResponseEnum responseEnum, Object[] objs) {
        super(message);
        this.responseEnum = responseEnum;
        this.objs = objs;
    }

    public BaseException(String message, Throwable cause, IResponseEnum responseEnum, Object[] objs) {
        super(message, cause);
        this.responseEnum = responseEnum;
        this.objs = objs;
    }
}

?自定義斷言接口

public interface MyAssert {

    /**
     * 創(chuàng)建自定義異常
     *
     * @param objs 參數(shù)信息
     * @return 自定義異常
     */
    BaseException newException(Object... objs);

    /**
     * 創(chuàng)建自定義異常
     *
     * @param msg  描述信息
     * @param objs 參數(shù)信息
     * @return 自定義異常
     */
    BaseException newException(String msg, Object... objs);

    /**
     * 創(chuàng)建自定義異常
     *
     * @param t    接收驗(yàn)證異常
     * @param msg  描述信息
     * @param objs 參數(shù)信息
     * @return 自定義異常
     */
    BaseException newException(Throwable t, String msg, Object... objs);


    /**
     * 校驗(yàn)非空
     *
     * @param obj 被驗(yàn)證對(duì)象
     */
    default void assertNotNull(Object obj, Object... objs) {
        if (obj == null) {
            throw newException(objs);
        }
    }

    /**
     * 校驗(yàn)非空
     *
     * @param obj 被驗(yàn)證對(duì)象
     */
    default void assertNotNull(Object obj, String msg, Object... objs) {
        if (obj == null) {
            throw newException(msg, objs);
        }
    }
}

上述代碼我們可以看出基本設(shè)計(jì),就是在我們自定義斷言失敗后拋出我們自定義異常。

下面是具體的實(shí)現(xiàn)案例:

?自定義業(yè)務(wù)異常類,繼承自異?;绢?/p>

public class BusinessException extends BaseException {

    public BusinessException(IResponseEnum responseEnum, Object[] args, String msg) {
        super(msg, responseEnum, args);
    }

    public BusinessException(IResponseEnum responseEnum, Object[] args, String msg, Throwable t) {
        super(msg, t, responseEnum, args);
    }

}

?響應(yīng)code枚舉接口定義

public interface IResponseEnum {

    /**
     * 返回code碼
     *
     * @return code碼
     */
    String getCode();

    /**
     * 返回描述信息
     *
     * @return 描述信息
     */
    String getMsg();
}

?自定義業(yè)務(wù)異常類斷言定義,實(shí)現(xiàn)自定義斷言失敗后對(duì)應(yīng)的自定義異常的定義;

public interface BusinessExceptionAssert extends IResponseEnum, MyAssert {

    @Override
    default BaseException newException(Object... args) {
        return new BusinessException(this, args, this.getMsg());    //斷言失敗后,拋出自定義異常
    }

    @Override
    default BaseException newException(String msg, Object... args) {
        return new BusinessException(this, args, msg);              //斷言失敗后,拋出自定義異常
    }

    @Override
    default BaseException newException(Throwable t, String msg, Object... args) {
        return new BusinessException(this, args, msg, t);           //斷言失敗后,拋出自定義異常
    }
}

?用枚舉的方式,代替BadLicenceException、UserNotFoundException自定義異常。

public enum ResponseEnum implements IResponseEnum, BusinessExceptionAssert {

    BAD_LICENCE("0001", "無(wú)權(quán)訪問(wèn)"),

    USER_NOT_FOUND("1001", "用戶不存在"),
    ;

    private final String code, msg;

    ResponseEnum(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getMsg() {
        return msg;
    }
}

使用實(shí)例

自定義斷言失敗拋出自定義異常

    @Override
    public UserVO queryUser(Long id) {
        UserDO userDO = userMapper.queryUserById(id);
        ResponseEnum.USER_NOT_FOUND.assertNotNull(userDO);    //自定義斷言失敗拋出自定義異常
        return userDO.toVo();
    }

網(wǎng)關(guān)處統(tǒng)一catch異常,識(shí)別異常場(chǎng)景

    public static void main(String[] args) {
        UserService userService = new UserServiceImpl(new UserMapperImpl());
        UserController userController = new UserController(userService);
        try {
            UserVO vo = userController.queryUser(2L);               //執(zhí)行業(yè)務(wù)邏輯
        } catch (BusinessException e) {
            System.out.println(e.getResponseEnum().getCode());      //出現(xiàn)異常,錯(cuò)誤code:1001
            System.out.println(e.getMessage());                     //出現(xiàn)異常,錯(cuò)誤msg:用戶不存在
        }
    }

五、如何優(yōu)雅的處理異常

網(wǎng)關(guān)處統(tǒng)一處理異常,這屬于常規(guī)操作,這里不再贅述,簡(jiǎn)單舉例如下:

@ControllerAdvice
public class BusinessExceptionHandler {
    
    @ExceptionHandler(value = BusinessException.class)
    @ResponseBody
    public Response handBusinessException(BaseException e) {
        return new Response(e.getResponseEnum().getCode(), e.getResponseEnum().getMsg());    //統(tǒng)一處理異常
    }
}

綜上,我們采用自定義斷言的方式,結(jié)合了斷言的可讀性高的優(yōu)勢(shì)和自定義異常區(qū)分錯(cuò)誤場(chǎng)景的優(yōu)勢(shì)。并且,有新增的錯(cuò)誤場(chǎng)景,我們只需要在錯(cuò)誤碼枚舉中新增對(duì)應(yīng)枚舉即可。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2970

    瀏覽量

    104812
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4791

    瀏覽量

    68688
  • 異常
    +關(guān)注

    關(guān)注

    0

    文章

    22

    瀏覽量

    9259
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何有效的處理空指針異常

    地遇到這個(gè)問(wèn)題。 那么我們應(yīng)該如何有效且優(yōu)雅處理空指針異常呢? 下面了不起將詳細(xì)的介紹這個(gè)處理方案。 1、什么是空指針異常? 空指針
    的頭像 發(fā)表于 09-30 10:25 ?1525次閱讀

    Java中的常用異常處理方法 java推薦

    Java中,異常情況分為Exception(異常)和Error(錯(cuò)誤)兩大類,Java異常通常是指程序運(yùn)行過(guò)程中出現(xiàn)的非正常情況,如用戶輸
    發(fā)表于 01-19 17:26

    Java異常處理及其應(yīng)用

    Java異常處理引出 假設(shè)您要編寫一個(gè) Java 程序,該程序讀入用戶輸入的一行文本,并在終端顯示該文本。 程序如下: 1 import ja
    發(fā)表于 11-09 12:03 ?15次下載

    Java異常處理之try,catch,finally,throw,throws

    ,程序繼續(xù)運(yùn)行。 java異常處理是通過(guò)5個(gè)關(guān)鍵字來(lái)實(shí)現(xiàn)的:try、catch、finally、throw、throws。 二:java異常
    發(fā)表于 09-27 11:17 ?0次下載
    <b class='flag-5'>Java</b><b class='flag-5'>異常</b><b class='flag-5'>處理</b>之try,catch,finally,throw,throws

    java異常處理的設(shè)計(jì)與重構(gòu)

    尋找出錯(cuò)的根源?但是如果一個(gè)項(xiàng)目異常處理設(shè)計(jì)地過(guò)多,又會(huì)嚴(yán)重影響到代碼質(zhì)量以及程序的性能。因此,如何高效簡(jiǎn)潔地設(shè)計(jì)異常處理是一門藝術(shù),本文下面先講述
    發(fā)表于 09-27 15:40 ?1次下載
    <b class='flag-5'>java</b><b class='flag-5'>異常</b><b class='flag-5'>處理</b>的設(shè)計(jì)與重構(gòu)

    java異常處理設(shè)計(jì)和一些建議

    出錯(cuò)從哪里尋找出錯(cuò)的根源?但是如果一個(gè)項(xiàng)目異常處理設(shè)計(jì)地過(guò)多,又會(huì)嚴(yán)重影響到代碼質(zhì)量以及程序的性能。因此,如何高效簡(jiǎn)潔地設(shè)計(jì)異常處理是一門藝術(shù),本文下面先講述
    發(fā)表于 09-28 11:48 ?0次下載
    <b class='flag-5'>java</b><b class='flag-5'>異常</b><b class='flag-5'>處理</b>設(shè)計(jì)和一些建議

    C語(yǔ)言異常處理案例代碼

    相信很多朋友在此之前可能根本沒有使用或者聽說(shuō)過(guò)C語(yǔ)言異常處理,印象中都是C++或者java才有的東西,C語(yǔ)言怎么會(huì)有
    的頭像 發(fā)表于 12-22 08:44 ?3824次閱讀

    java教程之如何進(jìn)行Java異常處理?

    本文檔的主要內(nèi)容詳細(xì)介紹的是java教程之如何進(jìn)行Java異常處理
    發(fā)表于 09-28 17:16 ?0次下載

    Java教程之零點(diǎn)起飛學(xué)Java異常處理資料說(shuō)明

    Java語(yǔ)言提供了異常機(jī)制來(lái)處理程序運(yùn)行過(guò)程中可能發(fā)生的各種非正常事件。通過(guò)異常處理機(jī)制,大大提
    發(fā)表于 02-20 10:41 ?11次下載
    <b class='flag-5'>Java</b>教程之零點(diǎn)起飛學(xué)<b class='flag-5'>Java</b>的<b class='flag-5'>異常</b><b class='flag-5'>處理</b>資料說(shuō)明

    Java程序設(shè)計(jì)教程之異常處理的詳細(xì)資料說(shuō)明

    本文檔的詳細(xì)介紹的是Java程序設(shè)計(jì)教程之異常處理的詳細(xì)資料說(shuō)明主要內(nèi)容包括了:1 什么是異常,2異常
    發(fā)表于 02-22 10:27 ?13次下載
    <b class='flag-5'>Java</b>程序設(shè)計(jì)教程之<b class='flag-5'>異常</b><b class='flag-5'>處理</b>的詳細(xì)資料說(shuō)明

    10個(gè)Java編程中異常處理最佳實(shí)踐

    這里是我收集的10個(gè)Java編程中進(jìn)行異常處理的10最佳實(shí)踐。在Java編程中對(duì)于檢查異常有褒有貶,強(qiáng)制
    的頭像 發(fā)表于 05-03 17:49 ?1935次閱讀

    Java異常的習(xí)題和代碼分析

    Java異常的習(xí)題和代碼分析
    發(fā)表于 07-08 14:54 ?5次下載
    <b class='flag-5'>Java</b><b class='flag-5'>異常</b>的習(xí)題和代碼<b class='flag-5'>分析</b>

    Java高級(jí)編程之異常處理

    對(duì)于我們所開發(fā)的程序而言,錯(cuò)誤是無(wú)法避免的。本文闡述了如何運(yùn)用java異常處理機(jī)制為我們控制和處理異常的出現(xiàn),從而保證程序的安全性和可用性
    發(fā)表于 07-08 16:14 ?19次下載
    <b class='flag-5'>Java</b>高級(jí)編程之<b class='flag-5'>異常</b><b class='flag-5'>處理</b>

    Java怎么排查oom異常

    Java中的OOM(Out of Memory)異常是指當(dāng)Java虛擬機(jī)的堆內(nèi)存不足以容納新的對(duì)象時(shí)拋出的異常。OOM異常是一種常見的運(yùn)行時(shí)
    的頭像 發(fā)表于 12-05 13:47 ?1257次閱讀

    如何解決C語(yǔ)言中的“訪問(wèn)權(quán)限沖突”異常?C語(yǔ)言引發(fā)異常原因分析

    如何解決C語(yǔ)言中的“訪問(wèn)權(quán)限沖突”異常?C語(yǔ)言引發(fā)異常原因分析? 在C語(yǔ)言中,訪問(wèn)權(quán)限沖突
    的頭像 發(fā)表于 01-12 16:03 ?5808次閱讀
    主站蜘蛛池模板: 超碰免费视频在线观看| 最近中文字幕MV免费高清视频8 | 把她带到密室调教性奴| 最新中文字幕在线视频| 一品探花论坛| 在线黑人抽搐潮喷| 中国videos1314tv| 中国农村妇女真实BBWBBWBBW| 有人有片的观看免费视频| 怡春院国产精品视频| 在线观看视频一区| 2012中文字幕在线动漫电影| 中文字幕 日韩 无码 在线| 最近中文字幕在线中文高清版 | 精品国产成a人在线观看| 黑人玩弄极品人妻系列| 黄色天堂在线| 久久精品成人免费网站| 久久秋霞理论电影| 老师别揉我胸啊嗯小说| 蜜桃成人在线| 欧美极限扩肛| 少妇高潮惨叫久久久久久电影| 十8禁用B站在线看漫画| 午夜伦理电影在线观免费| 亚洲AV精品一区二区三区不卡 | 精品一成人岛国片在线观看| 久久re视频这里精品青| 快播看黄片| 欧美午夜a级精美理论片| 日本人奶水中文影片| 天天躁日日躁狠狠躁AV麻豆| 亚洲精品高清中文字幕完整版| 一本色道久久88综合日韩精品| 在线中文字幕视频| av狼新人开放注册区| 高清国产在线播放成人| 国内精品视频久久久久免费| 久久久久综合一本久道| 欧美丰满白嫩bbxx| 天天躁日日躁狠狠躁中文字幕老牛|