質問

いくつかの追加フィールドを含むカスタム例外クラスがあります。これらを書き留めてほしい ToString() 方法ですが、私が自分のものを実装する場合 ToString(), 、私は他のいくつかの有用なものを失います(例外タイプ名、内部例外データ、スタックトレースを書くなど)。

あなた自身を実装するための最良の方法/パターンは何ですか ToString() そのような例外のための方法?理想的には、既存のメカニズムを再利用する必要がありますが、デフォルトと同様にフォーマットされます ToString() 実装。

更新:カスタムフィールドをBase.ToString()に準備または追加するテキストは理想的ではありません。たとえば

PimTool.Utilities.OERestServiceUnavailableException: test ---> System.InvalidOperationException: inner message
   --- End of inner exception stack trace ---
   at PimTool.Tests.Services.OE.OERestClientTests.ExceptionsLogging() in D:\svn\NewPimTool\PimTool.Tests\Services\OE\OERestClientTests.cs:line 178, 
   StatusCode=0, message='test', requestId='535345'

つまり、カスタムフィールドは(潜在的に長い)例外の説明の最後に記述されていることを意味します。一方、例外タイプを説明に記載された最初の情報にしたいと思います。

更新2:このためのソリューションを実装しました。以下の自分の答えを探してください。

役に立ちましたか?

解決 3

わかりました、これは私が思いついたものです。フォーマットの例外のための元のメカニズムを複製する拡張クラスを実装しましたが、ひねりを加えて、カスタムフィールドのフォーマット用のプラグインを提供するカスタムアクションデリゲート:

public static class ExceptionFormatterExtensions
{
    public static string ExceptionToString (
        this Exception ex, 
        Action<StringBuilder> customFieldsFormatterAction)
    {
        StringBuilder description = new StringBuilder();
        description.AppendFormat("{0}: {1}", ex.GetType().Name, ex.Message);

        if (customFieldsFormatterAction != null)
            customFieldsFormatterAction(description);

        if (ex.InnerException != null)
        {
            description.AppendFormat(" ---> {0}", ex.InnerException);
            description.AppendFormat(
                "{0}   --- End of inner exception stack trace ---{0}",
                Environment.NewLine);
        }

        description.Append(ex.StackTrace);

        return description.ToString();
    }
}

これで、フォーマットコードを複製せずに、この方法を独自のtoString()実装で使用できます。

    public override string ToString()
    {
        return this.ExceptionToString(
            description =>
            {
                description.AppendFormat(
                    ", HttpStatusCode={0}, RequestId='{1}'", 
                    httpStatusCode, 
                    RequestId);
            });
    }

他のヒント

これはすべて過剰です。あなたの例外は、メッセージプロパティをオーバーライドするだけです。

public override String Message {
    get {  
        return base.Message + String.Format(", HttpStatusCode={0}, RequestId='{1}'", 
                    httpStatusCode, 
                    RequestId);
    }
}

例外クラスのデフォルトのToStringメソッドは基本的にです」ClassName: Message --> InnerException.ToString() StackTrace"。だからメッセージをオーバーライドすると、メッセージテキストが正確にあるべき場所を正確に掲載します。

デフォルトのデータを手動で返される文字列に追加することができます ToString, 、例外プロパティを調べます。たとえば、以下は、例外によってデフォルトで返されたデータをシミュレートします ToString 方法(内部例外がないと仮定):

string.Format("{0}: {1}\r\n{2}", this.GetType().Name, this.Message, this.StackTrace);

または、返されたデータを単に追加(または準備)することもできます base.ToString 追加したい情報に。

ToString()メソッドをオーバーライドして独自のカスタム情報を含めることができますが、デフォルトのベース例外()をこのように呼び出すことができます。

public class MyException : Exception
{
    public string CustomField { get; set; }
    public override string ToString()
    {
        return CustomField + Environment.NewLine + base.ToString();
    }
}

あなたが主にデバッガーでそれらを見ているなら、あなたは [DebuggerDisplay] 属性のフォーマットを指定し、既存のものに触れないようにします ToString 方法。

それ以外の場合は、過負荷だけです ToString ベースクラスバージョンを必ず電話してください base.ToString()

オーバーライドの内部では、base.toString()を呼び出し、結果の文字列をニーズに合わせて変更します...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top