2011-10-18 46 views
2

我想圍繞.NET的代碼合同進行討論。在使用代碼合同時,如何記錄導致相關方法失敗的聲明。例如,看下面的代碼:如何將日誌整合到.NET代碼合同中

Public IsMatch(string x, string, y) 
{ 

    Contract.Assert(!string.IsNullOrWhiteSpace(x)); 
    Contract.Assert(!String.IsNullOrWhitespace(y)); 

     return x == y; 
} 

比方說說x = string.Empty。這會導致該方法失敗。如何記錄斷言導致上述方法失敗。我可以在大型應用程序中擁有許多這樣的斷言,並且很高興知道哪一個是麻煩製造者。

回答

3

當使用代碼合同,我怎麼登錄斷言引起的問題的方法失敗?

如果你在談論日誌記錄,我假設你的意思是在運行時而不是靜態驗證。

斷言在失敗時引發異常。你可以寫一個try/catch塊記錄異常:

try 
{ 
    bool result = SomeClass.IsMatch(x, y); 
} 
catch(Exception e) 
{ 
    logger.Error(e.ToString()); // Use whatever logging mechanism here 
    throw; // Note: Make sure you rethrow if you catch "Exception e" 
} 

這將讓你的異常,這將指向哪裏斷言失敗行的堆棧跟蹤。

隨着政體的提及,您還可以在每個斷言中包含一個userMessage參數。這樣,除了堆棧跟蹤之外,您的日誌將包含自定義錯誤消息。

如果您需要良好的logger課程,請參閱the NLog library

+0

謝謝。這有助於進一步解釋Polity的評論。 – Phil

3

看:http://msdn.microsoft.com/en-us/library/system.diagnostics.contracts.contract.aspx

基本上作爲第二個參數,你可以指定一個消息。

這就是說,Contract.Assert是非常原始的。由於對方法的要求,因此可以使用Contract.Requires更好地檢查後期條件。

編輯:後置條件應該ofcourse是預條件

+0

+1因爲這是很好的建議。我還添加了如何執行我的答案的實際日誌記錄。如果你願意的話,隨意選擇這個答案,因爲它是相當明顯的東西。 –

+0

謝謝。我應該閱讀手冊。 – Phil