Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将登录集成到.NET代码契约中_C#_.net_Code Contracts - Fatal编程技术网

C# 如何将登录集成到.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。这

我正试图对.NET的代码契约进行思考。使用代码契约时,如何记录导致所讨论的方法失败的断言。例如,请看以下代码:

  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的评论。