2011-12-21 32 views
2

我是一名C++開發人員,我非常喜歡java中的checked和unchecked異常。 C++中的異常規範簡直不好,這就是爲什麼沒有人使用它。我喜歡這個檢查異常,我有一個問題,讓我們有這樣的接口:檢查異常規範和策略模式

public interface Warehouse { 
    MyStuff fetch(int id); 
} 

倉庫可以用不同的方式來實現的:文件,數據庫或內存(用於測試模擬對象)。

現在,如果我想實現使用文件,我不能嘗試打開該方法中的文件,否則我的簽名將改變,我的班級將不再實現該界面。此外,如果我有另一個類與另一個檢查異常,所有其他現有的實現將受到影響。

我可以看到兩個解決方案:

  1. 趕上檢查的異常,並拋出另一個自定義運行時異常。我不認爲這是一個好的解決方案,爲什麼用戶應該捕獲一個運行時異常,指出在已經有標準和經過檢查的方式下文件丟失。

  2. 在實現類的構造函數中執行整個作業,並使提取函數無法拋出。我喜歡這種方式,對象既存在又有效,或者不存在。這種方法唯一的缺點是我們無法實施懶惰評估;我們需要在構造函數中讀取和解析文件,即使沒有人會使用該對象。這不是有效的。

我錯過了什麼嗎?有沒有更好的方法來避免這個問題?

+0

Uhoh,檢查與未經檢查的例外。這會產生很多討論。這在Java開發人員中是一個相當宗教的話題。 – tobiasbayer 2011-12-21 11:45:46

回答

2

你的第一個解決方案是正確的。你的界面更改爲:

public interface Warehouse { 
    MyStuff fetch(int id) throws FetchFailureException; 
} 

而且使每個子類中包裹的IO,JDBC或任何一個FetchFailureException內部例外。如果不可恢復,則此FetchFailureException異常應爲運行時,並檢查是否可恢復。

+0

好吧,我不知道你可以創建一個檢查異常。我明白你的觀點,但是它不會擴大異常類的數量? – 2011-12-21 12:23:20

+0

如果你有很多不同的情況,比如使用單個接口來定位多個數據源,每個都會拋出一種不同的異常。這並不常見。我更喜歡必須處理一種異常(FetchFailureException)而不是N(IO,SQL,Memory ...) – 2011-12-21 12:28:19

0

就個人而言,我將有倉庫列表中的所有可拋出的異常(包括在Javadoc中未檢查)

如果您有未列出的例外,你需要處理它或把它包起來。 (不管它是否被選中)

你必須讓你的頭腦瞭解你是否想讓倉庫拋出一個檢查過的異常。你不能雙方都有。 (其實你可以,但它不是一個好主意,因爲你可以在沒有編譯器知道的情況下盲目拋出一個檢查的異常)

0

最佳做法是指定方法將在界面中拋出的異常。

假設你有一個自定義異常類:

類MyException擴展異常
{
公共MyException (字符串消息){
超(消息);
}

public MyException(String message,Exception cause)
{
super(message, cause);
}

}

處理所有的MyException類異常,

現在你可以指定你的方法應該在接口拋出異常

公共接口倉庫
公共MyStuff fetch()拋出MyException;

}

0

我建議你在Warehouse類中的所有異常包括,然後用子接口工作,以便與非工作檢查異常,就像這樣:

public interface Warehouse { 
    MyStuff fetch(int id) throws FileNotFoundException;; 
} 

public interface FileWarehouse extends Warehouse { 
    @Override 
    MyStuff fetch(int id) throws FileNotFoundException; 
} 

public interface OtherWarehouse extends Warehouse { 
    @Override 
    MyStuff fetch(int id); 
} 
+0

如果您有1000個使用倉庫的位置,並且引入了引發SQLException而不是FileNotFoundException,你將不得不修復1000個編譯錯誤。如果您使用FetchFailureException之類的特定於域的異常,並將其中每個可能的異常都包含在內,那麼您就不會再遇到這個問題。 – 2011-12-21 12:11:14

+0

好點。謝謝。 – loscuropresagio 2011-12-21 17:14:33