C#: Übergeordneter Methode für benutzerdefinierte Ausnahmen überschrieben die Methode für benutzerdefinierte Ausnahmen

StackOverflow https://stackoverflow.com/questions/1886611

  •  19-09-2019
  •  | 
  •  

Frage

Ich habe eine benutzerdefinierte Ausnahmeklasse, die einige zusätzliche Felder enthält. Ich möchte, dass diese in der ausgeschrieben werden ToString() Methode, aber wenn ich meine eigene implementiere ToString(), Ich verliere einige andere nützliche Dinge (wie das Schreiben des Namenstyp -Namens, die inneren Ausnahmedaten und die Stapelspur).

Was ist der beste Weg/Muster, um Ihre eigenen zu implementieren? ToString() Methode für solche Ausnahmen? Idealerweise sollte es den bestehenden Mechanismus wiederverwenden, aber ähnlich wie bei der Standardeinstellung formatiert werden ToString() Implementierung.

Update: Vorbereitung oder Anhänge meiner benutzerdefinierten Felder an der Basis.ToString () Text ist zum Beispiel nicht ideal imho

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'

bedeutet, dass die benutzerdefinierten Felder am Ende der (potenziell langen) Ausnahmebeschreibung geschrieben sind. Andererseits möchte ich, dass der Ausnahmetyp die ersten Informationen in der Beschreibung sind.

Update 2: Ich habe eine Lösung dafür implementiert und nach meiner eigenen Antwort unten gesucht.

War es hilfreich?

Lösung 3

Ok, das habe ich mir ausgedacht. Ich habe eine Erweiterungsklasse implementiert, die den ursprünglichen Mechanismus für die Formatierung von Ausnahmen repliziert, jedoch mit einem Wendung: einem benutzerdefinierten Aktionsdelegierten, das ein Plug-In für die Formatierung benutzerdefinierter Felder bietet:

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();
    }
}

Jetzt können Sie diese Methode in Ihren eigenen ToString () -implementierungen verwenden, ohne den Formatierungscode zu duplizieren:

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

Andere Tipps

Das ist alles übertrieben. Ihre Ausnahme sollte einfach die Nachrichteneigenschaft außer Kraft setzen.

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

Die Standard -ToString -Methode für die Ausnahmeklasse ist im Grunde genommen ""ClassName: Message --> InnerException.ToString() StackTrace". Wenn Sie also die Nachricht überschreiben, gibt es Ihren Nachrichtentext genau dort, wo er sein sollte.

Sie können die Standarddaten manuell zur Zeichenfolge hinzufügen, die von zurückgegeben wird ToString, durch Betrachtung der Ausnahmeeigenschaften. Im Folgenden simuliert beispielsweise die von der Ausnahme standardmäßig zurückgegebenen Daten ToString Methode (vorausgesetzt, es gibt keine inneren Ausnahmen):

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

Oder Sie können einfach die von den Daten zurückgegebenen Daten anhängen (oder vorbereiten) base.ToString zu den Informationen, die Sie hinzufügen möchten.

Sie können die Methode toString () überschreiben, um Ihre eigenen benutzerdefinierten Informationen einzugeben, und rufen dennoch die Standard -Basis -Ausnahme -ToSstring () wie folgt auf:

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

Wenn Sie sie hauptsächlich im Debugger betrachten, können Sie die verwenden [DebuggerDisplay] Attribut, um ihre Formatierung anzugeben und die vorhandenen nicht zu berühren ToString Methode.

Ansonsten nur überlastet ToString und rufen Sie unbedingt die Basisklassenversion an base.ToString()

In der Override Call base.toString () und ändern Sie die resultierende Zeichenfolge an Ihre Bedürfnisse ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top