2011-12-04 79 views
1

我正在關注Fail Fast委託人。我想知道爲了檢查我的構造函數參數參數是否有適當的Assertion類是好的做法。創建自定義斷言類

例如:

public static class Assertions 
{ 
    public static void ParamterIsNotNull(object subject, string paramName = "") 
    { 
     if (subject == null) throw new ArgumentNullException(paramName, "Paramter cannot be null"); 
    } 
} 

,並在使用中:

public class Test 
{ 
    public Test(object obj) 
    { 
     Assertions.ParamterIsNotNull(obj, "obj"); 
    } 
} 

是來卸載異常拋出到另一類好的做法,還是不如直接拋出異常的構造函數?

回答

1

從我讀過的內容(在文章的最後),馬丁說,做兩件事情都很好 - 快速失敗,提供有意義的例外和「慢速失敗」 - 讓用戶具備觸目驚心的聯繫方式支持並繼續完成可以成功完成的任務,無論例外情況如何。

在這種情況下,批處理系統示例非常好 - 雖然批處理中的1項可能會令人失望,但用戶最可能希望剩下的部分處於隱患狀態,這就是爲什麼您拋出全局捕獲的異常處理程序(全局處理程序決定繼續處理下一個項目並彙總錯誤,以便將其顯示給用戶併發送通知給開發團隊)。

這種方式都完成了 - 大多數用戶的工作已經完成,快速失敗原則也被觸發。

所以它取決於你的具體情況 - 也許如果你的類參與了其他操作,將會有更多的全局類(或使用它的調用者類)能夠更好地決定它是否可以繼續。

另一方面 - 你的類不應該能夠告訴調用類是否可以在失敗的情況下做一些其他的工作,所以你需要拋出你的異常在構造函數中,是的。 這是我認爲 - 是:)。所以,如果你的班級代表批量的一個項目 - 調用者很可能會捕獲異常並繼續。如果它是某種入口點類的話 - 那麼你可能希望優雅地處理異常(或者根本不要拋出它),向用戶顯示錯誤消息並提供開發團隊的細節(日誌)以便於說明問題出在哪裏。