0

到目前为止,我已经了解到(通常)当你断言时,你也应该抛出。起初我不确定它是否正确,它只是有意义1,然后验证了这个答案

我遇到的问题是它会导致重复代码(至少通过合同)。下面是一个不能为空或空格的名称字段示例:

 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;
     }
 }

显然,条件和错误消息都重复了。我应该如何处理?在一个属性中它是可管理的,但在具有多个字段的类中它是乱扔垃圾。

附加信息

我想过使用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 并且在某个地方仍然存在您不知道的错误,那么发布构建将继续进行,就好像一切正​​常,地狱可能会崩溃。

4

1 回答 1

2

您链接到的答案是 about Debug.Assert,默认情况下对于发布版本是关闭的。我从不喜欢这个想法——这就像说只有在学习驾驶时才值得系安全带,而在高速驾驶时则不然。

我鼓励您使用Contract.Requires(没有单独的显式 throw 语句),然后确保配置您的项目,以便在发布版本中仍然检查先决条件。您对显示给用户的消息的担忧不是应该在这里解决的问题 - 它应该在您的一般异常处理中解决。如果您不想向用户显示异常消息,请不要显示它们......但要记录它们。你真的不应该尝试让异常对最终用户有意义......这不是他们的目的。

于 2013-03-01T15:16:05.060 回答