4

いくつかのデータを読み取り、それをディクショナリのような構造に入力し、それを操作してから、いくつかの出力ファイルを作成するコンソール アプリケーションがあります。

ただし、出力を印刷すると、次のように印刷されることがあります。

Fail:

本当にいけないところ。Google では何も見つかりません (あまり検索する必要はありません)。また、ソリューションで "fail" という文字列を検索しても何も見つかりません (そのため、私のコードではありません)。

なぜこれが起こっているのか分かりません.関連するブロックはしばしば例外を生成しますが、私はそれらをキャッチし、Console.WriteLine代わりに使用していたときTrace.WriteLineは正常に動作していました.

これを修正する方法がわかりません。

Fail:コンソールに出力される原因は何ですか?

ブレークポイントを設定して停止するにはどうすればよいですか?

これを理解するためにどこから探し始めますか?

4

1 に答える 1

2

Adriano の鋭い勘のおかげで、私は主張を犯人として疑うことができました。

実際、謎のFail:メッセージが出力されたときに実行されていたコード ブロックは、次のようなアサーションを呼び出していました。

Debug.Assert(myString.Length > 0);

明らかに、「Fail:」は「Assertion fail」として理解されることを意図しています。これを次のように変更することで確認できます。

Debug.Assert(myString.Length > 0, "Assertion failed with myString == \"" + myString + "\".");

これにより、Fail:メッセージが変更されFail: Assertion failed with myString == ""、混乱が解消され、さらにデバッグするための問題のハンドルが得られました (アサーションが失敗メッセージを生成する正確な行であることを知っているため)。

デバッグ モードでは、Visual Studio はアサートの失敗時に中断せず、代わりに失敗メッセージを出力に出力するだけであることが判明しました (中断の有効化については、こちらで説明しています)。私の場合、プログラムの出力がコンソールだけでなくファイルにも出力されるように、トレース リスナーを使用していました。これを行うために、次の初期化コードを使用しました。

    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。トレース リスナーもアサーション エラー メッセージを取得しているようです。(ログファイルとコンソールに表示されます。)

于 2012-11-20T12:10:52.397 に答える