控制台应用程序打印“失败:”

时间:2012-11-20 11:16:37

标签: c# .net assert tracelistener

我有一个控制台应用程序,它读取一些数据,将其填充到类似字典的结构中,对其进行操作然后制作一些输出文件。

但是,打印输出时,有时会打印:

Fail:

它真的不应该。我在Google上找不到任何东西(搜索的内容并不多),当我在我的解决方案中搜索字符串“fail”时,我找不到任何东西(所以这不是我的代码)。

我不知道为什么会发生这种情况,相关的块通常会产生异常,但我抓住了它们,当我使用Console.WriteLine而不是Trace.WriteLine时,它工作得很好,虽然我不能轻易确认这是原因。

我不知道如何解决这个问题。

什么可能导致Fail:被打印到控制台?

如何设置断点来阻止它?

我在哪里开始想要解决这个问题?

1 个答案:

答案 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生成输出。似乎跟踪侦听器也在接收断言失败消息。 (它们显示在我的日志文件和控制台中。)