2011-10-18 14 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とします。これにより、メソッドが失敗します。 assertが上記のメソッドを失敗させる原因をログに記録するにはどうすればいいですか?私は大規模なアプリでこのような多くの主張を持つことができますし、どちらがトラブルメーカーであるか知ることはうれしいでしょう。基本的には2番目のパラメータとしてメッセージを指定することができますhttp://msdn.microsoft.com/en-us/library/system.diagnostics.contracts.contract.aspx

:で

答えて

3

コードの契約を使用してofcourseのすべきですか?

ロギングについては、静的検証ではなく実行時を意味します。

アサートは、失敗すると例外を発生させます。あなたは例外をログに記録する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" 
} 

これは、アサーションが失敗した行を指すようになりますこれは、あなたの例外のスタックトレースを取得します。

Polityが述べたように、各アサーションにuserMessageパラメータを含めることもできます。そうすれば、ログにはスタックトレースに加えてカスタムエラーメッセージが含まれます。

loggerクラスが必要な場合は、the NLog libraryをご覧ください。

+0

ありがとうございます。これはPolityのコメントをさらに詳しく説明するのに役立ちます。 – Phil

3

ルック。

つまり、Contract.Assertはほんのプリミティブです。ポスト条件は、あなたのメソッドの要件からContract.Requiresを使用してよりよくチェックすることができます。

編集:ポストの条件はどのように私が失敗する問題の方法を起こしアサートを記録するか、事前条件

+0

+1これは良いアドバイスです。私は実際に私の答えを記録する方法を追加しました。あなたが望むのであれば、それはかなり明らかなものなので、この答えに自由に選んでください。 –

+0

ありがとうございます。私はマニュアルを読むべきだった。 – Phil

関連する問題