<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          處理Java異常的10個最佳實踐

          共 2127字,需瀏覽 5分鐘

           ·

          2020-09-16 17:30


          線上代碼不要使用printStackTrace()

          寫完代碼后請一定要檢查下,代碼中千萬不要有printStackTrace()。因為printStackTrace()只會在控制臺上輸出錯誤的堆棧信息,他只適合于用來代碼調(diào)試。

          真正需要記錄異常,請使用日志記錄。

          永遠不要在catch塊中吞掉異常

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

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

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

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

          一定要盡量避免上面的代碼,因為他的調(diào)用者完全不知道錯誤的原因到底是什么。

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

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

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

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

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

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

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

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

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

          永遠不要捕獲Throwable類

          這是一個嚴重的問題,因為Java中的Error也可以是Throwable的子類。但是Error是Java虛擬機本身無法控制的。Java虛擬機甚至可能不會在出現(xiàn)任何錯誤時請求用戶的catch子句。

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

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

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

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

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

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

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

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

          永遠不要在finally中拋出異常

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

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

          如果您不打算處理異常,請使用finally塊而不是catch塊

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

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


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



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

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


          好文章,我在看??

          瀏覽 57
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久大黄片 | av漫画 免费观看 | 免费AA片 | 五月在线黄片 | 无码做爱网站 |