[英]Wrapping a checked exception into an unchecked exception in Java?
我在java中有這個工廠方法:
public static Properties getConfigFactory() throws ClassNotFoundException, IOException {
if (config == null) {
InputStream in = Class.forName(PACKAGE_NAME).getResourceAsStream(CONFIG_PROP);
config = new Properties();
config.load(in);
}
return config;
}
我想將兩個已檢查的異常轉換為未經檢查的異常。 最好的方法是什么?
我應該捕獲異常並使用捕獲的異常作為內部異常拋出一個新的RuntimeException嗎?
有沒有更好的方法來做到這一點,或者我是否應該首先嘗試這樣做?
編輯:
只是為了澄清。 這些異常將是致命的,因為配置文件基本上是程序的操作,所有異常都將被捕獲並記錄在我的程序的頂層。
我的目的是避免不必要的拋出異常,將異常添加到調用我的工廠的每個方法的簽名中。
僅當客戶端無法從問題中恢復時,才應使用RuntimeException
。 做你正在談論的事情偶爾是合適的,但更多時候是不合適的。
如果您使用的JDK> = 1.4,那么您可以執行以下操作:
try { // Code that might throw an exception } catch (IOException e) { throw new RuntimeException(e); } catch (ClassNotFoundException e) { throw new RuntimeException(e); }
並且重新RuntimeException
將包含其中的原始原因。 這樣,線程頂端有人捕獲RuntimeException
- 你的線程會捕獲RuntimeException
所以它們不會只是默默地死掉,對吧? - 至少可以打印出原因的FULL堆棧跟蹤。
但正如其他人所說並會說的那樣,檢查例外是有原因的。 只有當您肯定您的客戶無法從您作為未經檢查的例外重新拋出的問題中恢復時才這樣做。
注意:比RuntimeException
更好的是使用更具體的未經檢查的異常(如果有的話)。 例如,如果您的方法拋出ClassNotFoundException
的唯一原因是因為缺少配置文件,您可以重新拋出MissingResourceException
,這是一個未經檢查的異常,但會提供有關您拋出它的原因的更多信息。 如果他們描述你正在重新拋出的問題,那么使用的其他好的RuntimeException
是IllegalStateException
, TypeNotPresentException
和UnsupportedOperationException
。
另請注意,線程始終捕獲RuntimeException並且至少記錄它總是一個好主意。 至少通過這種方式你可以理解為什么你的線程會消失。
關於異常處理最佳實踐的兩點:
並且您可以拋出RuntimeException有或沒有內部異常,具體取決於調用者可以使用它做什么。 如果你沒有重新拋出內部異常,那么你應該在你的方法中記錄它,如果重要的話。
你正在以正確的方式做到這一點。
為了讓檢查的異常通過而不進行檢查,您必須將它們包裝在未經檢查的異常中。
請記住,檢查例外是有原因的。
如果你想避免太多try - catch
es,請捕獲工廠本身的異常並在那里處理它們。 也許返回默認實現。
您必須在此處或其他地方處理異常。
由於這是一個工廠,我認為最好在工廠本身(相同的方法或不同的方法)處理這些異常,並返回默認實現。
無論如何,(業務函數)調用者將不知道遇到ClassNotFoundException
時必須做什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.