これまでのところ、(通常) アサートするときはスローも行う必要があることを学びました。最初はそれが正しいかどうか確信が持てず、理にかなって1、その後、この回答が検証されました。
私が抱えている問題は、コードの繰り返しが発生することです(少なくとも契約を介して)。null または空白を使用できない名前フィールドの例を次に示します。
public String Name
{
get { return _name; }
set
{
Contract.Requires(String.IsNullOrWhiteSpace(value) == false, "Names cannot be null or whitespace.");
if (String.IsNullOrWhiteSpace(value))
throw new ArgumentException("Names cannot be null or whitespace.");
_name = value;
}
}
明らかに、条件とエラー メッセージの両方が繰り返されます。どのように処理すればよいですか?1 つのプロパティでは管理可能ですが、複数のフィールドを持つクラスでは散らかっています。
追加情報
(デバッグでアサートし、リリースでスローする)を使用することを考えContract.Requires<TException>
ましたが、条件(コード)は例外のメッセージになり、ユーザーに表示される可能性が最も高くなります(ユーザーはおそらく知りたいと思うでしょう)なぜ彼のプログラムがクラッシュしたのか、実際のコードは示したくありません)。次に例を示します。
static void MyFunction(Boolean youCanSeeMyCode = false)
{
Contract.Requires<Exception>(youCanSeeMyCode, "(This is the exception's message)");
}
...
try
{
MyFunction();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error");
}
助言がありますか?私は途方に暮れています。
1 assert だけを使用していて、気付いていないバグがどこかに残っている場合、リリース ビルドはすべてが順調であるかのように続行され、地獄が解き放たれる可能性があるため、これは理にかなっています。