App下載

解決Java異常的10個實踐經驗

猿友 2020-09-23 10:20:43 瀏覽數 (2313)
反饋

文章來源于公眾號:Java之道 ,作者Hollis

異常處理對于編寫健康茁壯的Java應用起著極其重要的作用。異常處理并不是功能性需求,在實踐中,異常處理不單單是知道語法這么簡單。下面給大家展示10個最佳實踐。

線上代碼不要使用printStackTrace()

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

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

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

catch (NoSuchMethodException e) {
     return null;
  }

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

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

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

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

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

public void foo() throws SpecificException1, SpecificException2 { 
//正確做法
}

始終只捕獲那些可以處理的異常

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

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

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

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

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

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

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

永遠不要捕獲Throwable類

這是一個嚴重的問題,因為 Java 中的Error也可以是Throwable的子類。但是ErrorJava 虛擬機本身無法控制的。Java 虛擬機甚至可能不會在出現任何錯誤時請求用戶的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;
  }

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

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

永遠不要在finally中拋出異常

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

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

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

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

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

以上就是W3Cschool編程獅關于解決Java異常的10個實踐經驗的相關介紹了,希望對大家有所幫助。

0 人點贊