重复代码断言和投掷

时间:2013-03-01 15:13:13

标签: c# exception-handling assert code-contracts code-duplication

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

我遇到的问题是它会导致重复代码(至少通过合同)。以下是名称字段的示例,该字段不能为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;
     }
 }

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

其他信息

我想过使用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");
}

Error Message

有什么建议吗?我很茫然。


1 这是有道理的,因为如果你只使用断言并且你仍然有一个你不知道的地方的错误,那么释放版本将继续进行,好像一切都好,地狱可能会破裂。

1 个答案:

答案 0 :(得分:2)

您链接的答案是关于Debug.Assert,默认情况下会针对发布版本关闭。我从来都不喜欢这个想法 - 就像说你学习驾驶时只戴安全带一样,但不是在你开速的时候。

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