0

これらをコード全体に散りばめた場合:

MessageBox.Show("See a format exception yet? #1");//todo: remove

(これらのうち7つがあり、1..7から番号が付けられ、そのほとんどが(1,2,5,6,7)を表示します)

最終的に1つのerrmsgが発生します( "例外:テーブル0が見つかりません場所:frmFunction.SetPlatypus ")

それらすべてをコメントアウトすると、別のerr msg( "例外:FormatExceptionの場所frmFunction.getDuckbillRecord ")になります。

これはどうやってできるの?そのような情報メッセージの存在/表示は、コードの実行方法/コードがたどるパスなどに影響を与えるべきではありませんか?

注:getDuckbillRecord()は、すべてのメッセージボックスがある場所です。

アップデート

RTの提案を動機として使用して、私はこれを思いついた:

public static StringBuilder LogMsgs = new StringBuilder();

    public static void ExceptionHandler(Exception ex, string location)
    {
        try
        {
            LogMsgs.Append(string.Format("{0}\r\n", ex.Message)); //TODO: Comment out before deploying?
            DateTime dt = DateTime.Now;
            string timeAsStr = string.Format("{0}_{1}_{2}_{3}.txt", dt.Hour, dt.Minute, dt.Second, dt.Millisecond);
            using (StreamWriter file = new StreamWriter(timeAsStr))
            {
                file.WriteLine(LogMsgs.ToString());
            }
            . . .

//in the problematic code, replacing the MessageBox.Show() calls:

    TTBT.LogMsgs.Append("Made it to location 1 in frmOverFunction.GetDuckbillRecord()\r\n");

...そしてそれは役に立ちました-7つの「コードウェイポイント」の最初の直後に例外に到達したので、明らかにその特定のデンマークで何かが腐っています。

更新2

どこかでクラッシュすることなくアプリを実行できるというまれな経験の後、メインフォームのOnClosing()イベントのファイル書き込みコードも必要であることに気付きました-グローバル例外ハンドラーにあることはしばらくの間機能していました-私は予期していませんでしたアプリのクリーンな終了が二度と起こらないと思います。

4

1 に答える 1

3

特にUIのフロー/状態が重要な場合は、ダイアログをポップアップすると、多くの微妙なバグや動作やフォーカスなどの変更が発生する可能性があるため、エラーのログ記録/トレース/デバッグには使用しないことを強くお勧めします。MessageBox.Show(...)

代わりに、System.Diagnostics.Traceトレースコード(オプションで本番/リリースコードにコンパイルできます)System.Diagnostics.Debugを記述したり、リリースバージョンのビルド時に削除されるデバッグメッセージを記述したりするために使用します。

例えば:

public void DoSomething(int a, int b)
{
    Trace.TraceInformation("Starting to do something: a = {0}, b = {1}",
        a, b);

    try 
    {
        int c = a / b;
    }
    catch (DivideByZeroException e)
    {
        Debug.WriteLine("OH NO ... 'b' WAS ZERO!!!! RUN AWAY!!!!");
        throw e;
    }

    Trace.TraceInformation("Done doing something");
}

上記の例では、デバッグ出力はデバッグビルドで使用できますが、リリースビルドでは削除されます。トレース出力はデバッグおよび小売りのバグで利用できますが(TRACEビルドパラメーターをオフにしない限り)、リスナーを接続して、回転するディスク、ティッカーテーププリンターなどの低速メディアにトレース出力を書き込み始めない限り、パフォーマンスへの影響は測定できません。 、など;)

Visual Studioでトレースを使用してコードを実行したり、デバッグメッセージを使用してデバッグビルドを実行したりすると、メッセージが出力ペインに書き込まれるため、アプリの実行中にアプリ内で何が起こっているかを確認できます。

必要に応じて、トレースおよび/またはデバッグメッセージをリッスンしてファイル/データベースに記録するか、コンソールウィンドウ(または必要に応じてGUI)に表示するスタンドアロンのトレースリスナーを作成することもできます。

log4netなどのツールを使用して、ログ/トレースメッセージをさまざまなファイル形式やデータベースなどに書き込むこともできます。

于 2013-03-26T19:11:42.447 に答える