我有一个控制台应用程序,它读取一些数据,将其填充到类似字典的结构中,对其进行操作然后制作一些输出文件。
但是,打印输出时,有时会打印:
Fail:
它真的不应该。我在Google上找不到任何东西(搜索的内容并不多),当我在我的解决方案中搜索字符串“fail”时,我找不到任何东西(所以这不是我的代码)。
我不知道为什么会发生这种情况,相关的块通常会产生异常,但我抓住了它们,当我使用Console.WriteLine
而不是Trace.WriteLine
时,它工作得很好,虽然我不能轻易确认这是原因。
我不知道如何解决这个问题。
什么可能导致Fail:
被打印到控制台?
如何设置断点来阻止它?
我在哪里开始想要解决这个问题?
答案 0 :(得分:2)
感谢Adriano的熟练预感,我能够怀疑断言是罪魁祸首。
确实,打印出神秘的Fail:
消息时运行的代码块确实调用了这样的断言:
Debug.Assert(myString.Length > 0);
显然,“失败:”应理解为“断言失败”。我可以通过将其更改为:
来验证这一点Debug.Assert(myString.Length > 0, "Assertion failed with myString == \"" + myString + "\".");
这将Fail:
消息更改为Fail: Assertion failed with 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
生成输出。似乎跟踪侦听器也在接收断言失败消息。 (它们显示在我的日志文件和控制台中。)