2012-11-20 43 views
4

我有一個控制檯應用程序,它讀取一些數據,將其填充到類似Dictionary的結構中,對其進行處理,然後生成一些輸出文件。控制檯應用程序打印「失敗:」

然而,在打印輸出時,它有時會打印:

Fail: 

凡實在不應該。我在Google上找不到任何東西(搜索起來不是很多),當我在解決方案中搜索字符串「失敗」時找不到任何內容(所以這不是我的代碼)。

我不知道爲什麼發生這種情況,相關的塊不會經常產生異常,但我趕上他們,當我使用Console.WriteLine代替Trace.WriteLine它做工精細,雖然我不能輕易地驗證這是否是原因。

我不知道如何解決這個問題。

什麼可能導致Fail:被打印到控制檯?

我該如何把一個斷點停在它?

我從哪裏開始尋找解決這個問題?

+2

模糊的問題可能是,我覺得我有一個合法的問題。如果有人對我可以提供的其他信息有什麼建議,請成爲我的客人。也就是說,沉默的投票並不是很有幫助 - 沒有被告知有什麼問題,我只能斷定選民只是處於一種交叉的情緒。 – Superbest

+2

它可能是失敗斷言的跟蹤輸出嗎? –

+0

@Adriano是的,結果是這樣。那裏有一個斷言,沒有失敗的消息。你可以發佈這個答案,以便我可以接受它嗎? – Superbest

回答

2

感謝阿德里亞諾的熟練直覺,我能夠懷疑主張是罪魁禍首。

事實上,進行了打印的神祕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產生輸出。跟蹤偵聽器看起來也正在拾取斷言失敗消息。 (他們出現在我的日誌文件以及控制檯中。)