26

考えられるすべての内部例外を含む完全な例外の詳細をログに記録するためのベスト プラクティスは何ですか?

現在、次のコードを使用しています。

try
{
    //some code that throws an exception
}
catch(Exception ex)
{
    do
    {
        Console.WriteLine(ex.Message+ex.StackTrace);
        ex=ex.InnerException;
    }while(ex!=null)
}

このコードが失敗するシナリオはありますか?

4

2 に答える 2

46

を使ってみましたex.ToString()か?メッセージの詳細、スタック トレース、内部例外など、診断に必要なデータのほとんど (すべてではないにしても) が得られます。

MSDNから:

ToString は、人間が理解できるように意図された現在の例外の表現を返します。例外にカルチャに依存するデータが含まれている場合、ToString によって返される文字列表現は、現在のシステム カルチャを考慮する必要があります。返される文字列の形式に厳密な要件はありませんが、ユーザーが認識したオブジェクトの値を反映するように努める必要があります。ToString の既定の実装は、現在の例外をスローしたクラスの名前、メッセージ、内部例外で ToString を呼び出した結果、および Environment.StackTrace を呼び出した結果を取得します。これらのメンバーのいずれかが null の場合、その値は返される文字列に含まれません。

于 2013-08-28T13:58:23.690 に答える
28

私の目的に合ったこの拡張メソッドがあります。

public static class ExceptionExtensions {
    public static string ToMessageAndCompleteStacktrace(this Exception exception) {
        Exception e = exception;
        StringBuilder s = new StringBuilder();
        while (e != null) {
            s.AppendLine("Exception type: " + e.GetType().FullName);
            s.AppendLine("Message       : " + e.Message);
            s.AppendLine("Stacktrace:");
            s.AppendLine(e.StackTrace);
            s.AppendLine();
            e = e.InnerException;
        }
        return s.ToString();
    }
}

そして、次のように使用します。

using SomeNameSpaceWhereYouStoreExtensionMethods;
try {
    // Some code that throws an exception
}
catch(Exception ex) {
    Console.WriteLine(ex.ToMessageAndCompleteStacktrace());
}

アップデート

この回答に対して賛成票を受け取っているので、この拡張メソッドの使用をやめたことを追加したいと思いexception.ToString()ます。より多くの情報を提供します。したがって、このメソッドの使用をやめて、 を使用してください.ToString()上記の回答を参照してください

于 2013-08-28T13:53:28.763 に答える