C# 如何将登录集成到.NET代码契约中
我正试图对.NET的代码契约进行思考。使用代码契约时,如何记录导致所讨论的方法失败的断言。例如,请看以下代码:C# 如何将登录集成到.NET代码契约中,c#,.net,code-contracts,C#,.net,Code Contracts,我正试图对.NET的代码契约进行思考。使用代码契约时,如何记录导致所讨论的方法失败的断言。例如,请看以下代码: Public IsMatch(string x, string, y) { Contract.Assert(!string.IsNullOrWhiteSpace(x)); Contract.Assert(!String.IsNullOrWhitespace(y)); return x == y; } 假设x=string.Empty。这
Public IsMatch(string x, string, y)
{
Contract.Assert(!string.IsNullOrWhiteSpace(x));
Contract.Assert(!String.IsNullOrWhitespace(y));
return x == y;
}
假设x=string.Empty
。这将导致该方法失败。如何记录断言导致上述方法失败。在一个大型应用程序中,我可以有很多这样的断言,如果知道哪一个是麻烦制造者,那就太好了。看看:
基本上,作为第二个参数,您可以指定消息
也就是说,Contract.Assert非常原始。使用Contract.Requires可以更好地检查Post条件,因为它是您的方法的一个要求
编辑:后条件当然应该是先决条件
当使用代码契约时,如何记录导致相关方法失败的断言
如果你说的是日志记录,我想你指的是运行时而不是静态验证
断言失败时会引发异常。您可以编写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
参数。这样,除了堆栈跟踪之外,日志还将包含自定义错误消息
如果您需要一个好的
记录器
类,请查看。+1,因为这是一个很好的建议。我还添加了如何实际记录我的答案。如果你愿意的话,可以随意把它加入这个答案,因为这是非常明显的东西。谢谢。这有助于进一步解释Polity的评论。