1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 2127字,需瀏覽 5分鐘

         ·

        2020-09-16 17:30


        線上代碼不要使用printStackTrace()

        寫完代碼后請(qǐng)一定要檢查下,代碼中千萬不要有printStackTrace()。因?yàn)閜rintStackTrace()只會(huì)在控制臺(tái)上輸出錯(cuò)誤的堆棧信息,他只適合于用來代碼調(diào)試。

        真正需要記錄異常,請(qǐng)使用日志記錄。

        永遠(yuǎn)不要在catch塊中吞掉異常

        catch?(NoSuchMethodException?e)?{
        ?????return?null;
        ??}

        永遠(yuǎn)不要不處理異常,而是返回null,這樣異常就會(huì)被吞掉,無法獲取到任何失敗信息,會(huì)給日后的問題排查帶來巨大困難。

        在需要的地方聲明特定的受檢異常

        ?public?void?foo()?throws?Exception?{?//錯(cuò)誤做法
        ??}

        一定要盡量避免上面的代碼,因?yàn)樗恼{(diào)用者完全不知道錯(cuò)誤的原因到底是什么。

        在方法聲明中,可以由方法拋出一些特定受檢異常。如果有多個(gè),那就分別拋出多個(gè),這樣這個(gè)方法的使用者才會(huì)分別針對(duì)每個(gè)異常做特定的處理,從而避免發(fā)生故障。

        public?void?foo()?throws?SpecificException1,?SpecificException2?{?
        //正確做法
        }
        ###?始終只捕獲那些可以處理的異常

        catch?(NoSuchMethodException?e)?
        {
        ????throw?e;?//這代碼一點(diǎn)用都沒有
        }

        這是一個(gè)基本概念,當(dāng)你能夠處理他時(shí),你再捕獲這個(gè)異常,否則永遠(yuǎn)都不要捕獲他。

        如果你不能在catch塊中處理它,那么就不要先捕獲再直接拋出,這樣沒有任何意義。

        盡量捕獲特定的子類,而不是直接捕獲Exception類

        try?{
        ??????someMethod();
        ??}?
        ??catch?(Exception?e)?
        ??{
        ??????LOGGER.error("method?has?failed",?e);
        ??}

        以上代碼,最大的問題就是,如果someMethod()的開發(fā)者在里面新增了一個(gè)特定的異常,并且預(yù)期是調(diào)用方能夠特殊的對(duì)他進(jìn)行處理。

        但是調(diào)用者直接catch了Exception類,就會(huì)導(dǎo)致永遠(yuǎn)無法知道someMethod的具體變化細(xì)節(jié)。這久可能導(dǎo)致在運(yùn)行的過程中在某一個(gè)時(shí)間點(diǎn)程序崩潰。

        永遠(yuǎn)不要捕獲Throwable類

        這是一個(gè)嚴(yán)重的問題,因?yàn)镴ava中的Error也可以是Throwable的子類。但是Error是Java虛擬機(jī)本身無法控制的。Java虛擬機(jī)甚至可能不會(huì)在出現(xiàn)任何錯(cuò)誤時(shí)請(qǐng)求用戶的catch子句。

        始終在自定義異常中覆蓋原有的異常,這樣堆棧跟蹤就不會(huì)丟失

        ?catch?(NoSuchMethodException?e)?
        ??{
        ??throw?new?MyServiceException("Some?information:?"?+?e.getMessage());??//錯(cuò)誤做法
        ??}

        上面的命令可能會(huì)丟失掉主異常的堆棧跟蹤。正確的方法是:

        catch?(NoSuchMethodException?e)?{
        ?????throw?new?MyServiceException("Some?information:?"?,?e);??//正確做法
        }

        可以記錄異常或拋出異常,但不要同時(shí)做

        catch?(NoSuchMethodException?e)?{
        ?????LOGGER.error("Some?information",?e);
        ?????throw?e;
        ??}

        如上面的代碼所示,拋出和日志記錄可能會(huì)在日志文件中產(chǎn)生多個(gè)日志消息。

        這就會(huì)導(dǎo)致同一個(gè)問題,卻在日志中有很多不同的錯(cuò)誤信息,使得開發(fā)人員陷入混亂。

        永遠(yuǎn)不要在finally中拋出異常

        try?{
        ??someMethod();??//拋出?exceptionOne
        }
        ?finally
        {
        ??cleanUp();????//如果在這里再拋出一個(gè)異常,那么try中的exceptionOne將會(huì)丟失forever
        }

        在上面的例子中,如果someMethod()拋出一個(gè)異常,并且在finally塊中,cleanUp()也拋出一個(gè)異常,那么初始的exceptionOne(正確的錯(cuò)誤異常)將永遠(yuǎn)丟失。

        如果您不打算處理異常,請(qǐng)使用finally塊而不是catch塊

        try?{
        ??someMethod();?
        }?
        finally
        {
        ??cleanUp();????
        }

        這也是一個(gè)很好的實(shí)踐。如果在你的方法中訪問其他方法,而該方法拋出了異常你不想處理,但是仍然需要做一些清理工作,那么在finally塊中進(jìn)行清理。不要使用catch塊。


        關(guān)于作者Hollis(ID:hollischuang),一個(gè)對(duì)Coding有著獨(dú)特追求的人,現(xiàn)任阿里巴巴技術(shù)專家,個(gè)人技術(shù)博主,技術(shù)文章全網(wǎng)閱讀量數(shù)千萬,《程序員的三門課》聯(lián)合作者。



        有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)

        歡迎大家關(guān)注Java之道公眾號(hào)


        好文章,我在看??

        瀏覽 57
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产操逼逼视频 | 亚洲中文字幕无码在线 | 91kantv在线播放少妇 | 91AV视频在线观看 | 欧美韩日| 欧美色婷婷69av | 亚洲女bdsm受虐狂 | 国产精品久久7777777精品无码 | 永久在线视频 | 天天爽天天插 |