我试图围绕.NET的代码合同。使用代码契约时,如何记录断言导致相关方法失败。例如,看看这段代码:
Public IsMatch(string x, string, y)
{
Contract.Assert(!string.IsNullOrWhiteSpace(x));
Contract.Assert(!String.IsNullOrWhitespace(y));
return x == y;
}
让我们说x = string.Empty
。这将导致方法失败。如何记录断言导致上述方法失败。我可以在一个大型应用程序中有很多这样的断言,很高兴知道哪个是麻烦制造者。
答案 0 :(得分:3)
请注意:http://msdn.microsoft.com/en-us/library/system.diagnostics.contracts.contract.aspx
基本上,您可以指定一条消息作为第二个参数。
那就是说,Contract.Assert非常原始。可以使用Contract.Requires更好地检查发布条件,因为它是对您的方法的要求。
编辑:发布条件应该是先决条件
答案 1 :(得分:3)
使用代码契约时,如何记录导致相关方法失败的断言?
如果您正在谈论日志记录,我认为您的意思是在运行时而不是静态验证。
断言在失败时引发异常。您可以编写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。