我有一个控制台应用程序,它读取一些数据,将其填充到类似字典的结构中,操纵它然后制作一些输出文件.
但是,在打印输出时,它有时会打印:
Fail:
它真的不应该在哪里.我在Google上找不到任何东西(搜索的内容并不多),当我在我的解决方案中搜索字符串“fail”时,我找不到任何东西(所以这不是我的代码所做的).
我不知道为什么会发生这种情况,相关的块通常会产生异常,但是我抓住它们,当我使用Console.WriteLine而不是Trace.WriteLine时,它工作正常,但我无法轻易验证这是原因.
我不知道如何解决这个问题.
什么可能导致失败:被打印到控制台?
我如何设置一个断点来阻止它呢?
我甚至在哪里开始想要解决这个问题?
最佳答案 感谢Adriano的熟练预感,我能够怀疑断言是罪魁祸首.
实际上,在打印神秘的Fail:消息时运行的代码块确实调用了这样的断言:
Debug.Assert(myString.Length > 0);
显然,“失败:”应理解为“断言失败”.我可以通过将其更改为:
Debug.Assert(myString.Length > 0, "Assertion failed with myString == \"" + myString + "\".");
这改变了Fail:消息失败:断言失败,myString ==“”并消除了混乱,并让我处理了进一步调试的问题(因为我知道断言是生成失败消息的确切行).
事实证明,在调试模式下,Visual Studio不会中断断言失败,而是简单地将失败消息打印到输出(启用中断会在here中讨论).就我而言,我一直在使用跟踪侦听器,以便我的程序输出将打印到文件和控制台.为此,我使用了以下初始化代码:
private static void PrepareListeners()
{
Trace.Listeners.Clear();
var logPath = "/path/to/my/file.txt";
File.Delete(logPath);
var textListener = new TextWriterTraceListener(logPath);
var consoleListener = new ConsoleTraceListener(false);
consoleListener.TraceOutputOptions = TraceOptions.DateTime;
Trace.Listeners.Add(textListener);
Trace.Listeners.Add(consoleListener);
Trace.AutoFlush = true;
}
然后我用Trace.WriteLine生成输出.似乎跟踪侦听器也在接收断言失败消息. (它们显示在我的日志文件和控制台中.)