到目前为止,我已经了解到(通常)当你断言时,你也应该抛出。起初我不确定它是否正确,它只是有意义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 并且在某个地方仍然存在您不知道的错误,那么发布构建将继续进行,就好像一切正常,地狱可能会崩溃。