2016-01-20 134 views
1

以下靜態輔助函數是否爲反模式?從輔助函數中拋出異常

public class CustomException extends RuntimeException { 
    // ... 
    public static void rethrow(String s, Exception e) throws CustomException { 
     throw new CustomException(s + "\n" + "Exception: " + e.getMessage()); 
    } 
} 

http://javapeanuts.blogspot.com/2012/02/exception-management-antipatterns.html或其他地方看不到它。

一個直接的問題是靜態的警告會出現問題,例如我不能做了以下幾點:

final Blah blah = null; 
try { 
    blah = foo(); 
} 
catch (Exception e) { 
    CustomException.rethrow("Couldn't blah", e); 
} 
bar = blah.bar(); // ERROR: Variable 'blah' might not have been initialized. 

Hmmmm,我想我解決了這個問題。 :-)我應該爲CustomException創建一個構造函數,它將String和Exception作爲參數。

+1

是的,您將失去原始異常中的堆棧跟蹤信息。 – nickb

回答

2

是的,捕獲RuntimeException並在應用程序內創建一個新路徑是不允許的,因爲捕獲RuntimeException是完全錯誤的,因爲拋出它的主要原因主要是爲了處理資源例如你的系統和其他的東西,與你的代碼無關。

相反,您應該終止指定的代碼流並分別通知用戶。

,也有一些情況下,所描繪的反模式聽起來更好,所以,你最好去通過下面的線程,以便制定一個更好的主意,根據您的問題,在任何給定時間:

以上不超過單詞,這意味着最終,最終的設計(即遵循語言規範/創建反模式)取決於你,但是你應該始終記住(並且根據情況相應地決定/採取行動),就是一層的運行時異常是另一層的檢查(並且起作用)異常

+0

很酷,謝謝你的鏈接和想法。我在第一個實例中需要的是構造函數,而不是幫助函數,即: 'public CustomExceptionString s,Exception e){(「+」\ n「+」Exception:「+ e.getMessage()) ; }' – jones77