Ich habe Code, der protokolliert Exception.Message
. Ich habe jedoch einen Artikel gelesen, der besagt, dass es besser ist, ihn zu verwenden Exception.ToString()
. Mit letzterem behalten Sie wichtigere Informationen über den Fehler.
Ist dies wahr und ist es sicher, die gesamte Codeprotokollierung zu ersetzen Exception.Message
?
Ich verwende auch ein XML-basiertes Layout für log4net . Ist es möglich, dass Exception.ToString()
ungültige XML-Zeichen enthalten sind, was zu Problemen führen kann?
Antworten:
Exception.Message
enthält nur die der Ausnahme zugeordnete Nachricht (doh). Beispiel:Die
Exception.ToString()
Methode liefert eine viel ausführlichere Ausgabe, die den Ausnahmetyp, die Nachricht (von zuvor), eine Stapelverfolgung und all diese Dinge erneut für verschachtelte / innere Ausnahmen enthält. Genauer gesagt gibt die Methode Folgendes zurück:quelle
Verwenden Sie das Ausnahmeobjekt nicht zusätzlich zu dem, was bereits gesagt wurde,
ToString()
für die Anzeige für den Benutzer. Nur dieMessage
Eigenschaft sollte ausreichen oder eine übergeordnete benutzerdefinierte Nachricht.Verwenden Sie in Bezug auf Protokollierungszwecke auf jeden Fall
ToString()
die Ausnahme und nicht nur dieMessage
Eigenschaft, da Sie sich in den meisten Szenarien am Kopf kratzen müssen, wo genau diese Ausnahme aufgetreten ist und wie der Aufrufstapel war. Die Stapelspur hätte dir das alles gesagt.quelle
Konvertieren der GANZEN Ausnahme in einen String
Wenn
Exception.ToString()
Sie anrufen, erhalten Sie mehr Informationen als nur die Nutzung derException.Message
Eigenschaft. Selbst dies lässt jedoch noch viele Informationen aus, darunter:Data
Sammlungseigenschaft, die in allen Ausnahmen gefunden wurde.Es gibt Zeiten, in denen Sie diese zusätzlichen Informationen erfassen möchten. Der folgende Code behandelt die oben genannten Szenarien. Außerdem werden die Eigenschaften der Ausnahmen in einer schönen Reihenfolge geschrieben. Es verwendet C # 7, sollte aber für Sie sehr einfach sein, bei Bedarf auf ältere Versionen zu konvertieren. Siehe auch diese verwandte Antwort.
Top Tipp - Protokollierungsausnahmen
Die meisten Benutzer verwenden diesen Code für die Protokollierung. Erwägen Sie die Verwendung von Serilog mit meinem Serilog.Exceptions NuGet-Paket, das auch alle Eigenschaften einer Ausnahme protokolliert, dies jedoch in den meisten Fällen schneller und ohne Reflexion tut. Serilog ist ein sehr fortschrittliches Protokollierungsframework, das zum Zeitpunkt des Schreibens der letzte Schrei ist.
Top Tipp - Vom Menschen lesbare Stapelspuren
Sie können das Ben.Demystifier NuGet-Paket verwenden, um lesbare Stapelspuren für Ihre Ausnahmen abzurufen, oder das Serilog-Anreicherungs-entmystifizieren NuGet-Paket, wenn Sie Serilog verwenden.
quelle
Ich würde sagen, @Wim ist richtig. Sie sollten sie
ToString()
für Protokolldateien verwenden - unter der Annahme einer technischen Zielgruppe - undMessage
wenn überhaupt, um sie dem Benutzer anzuzeigen. Man könnte argumentieren, dass selbst das nicht für einen Benutzer geeignet ist, für jeden Ausnahmetyp und jedes Vorkommen da draußen (denken Sie an ArgumentExceptions usw.).Enthält zusätzlich zu StackTrace
ToString()
auch Informationen, die Sie sonst nicht erhalten. Zum Beispiel die Ausgabe von Fusion, wenn diese Option aktiviert ist , um Protokollnachrichten in die Ausnahme "Nachrichten" aufzunehmen.Einige Ausnahmetypen enthalten sogar zusätzliche Informationen (z. B. aus benutzerdefinierten Eigenschaften) in
ToString()
, jedoch nicht in der Nachricht.quelle
Hängt von den Informationen ab, die Sie benötigen. Zum Debuggen sind der Stack-Trace und die innere Ausnahme nützlich:
quelle
Exception.ToString()
dir geben wird, oder?StringBuilder
in diesem Szenario ist möglicherweise teurer als zwei neue Zeichenfolgenzuweisungen. Es ist höchst umstritten, dass es hier effizienter wäre. Es ist nicht so, als hätten wir es mit Iterationen zu tun. Pferde für Kurse.In Bezug auf das XML-Format für log4net müssen Sie sich keine Gedanken über ex.ToString () für die Protokolle machen. Übergeben Sie einfach das Ausnahmeobjekt selbst und log4net erledigt den Rest, um Ihnen alle Details in seinem vorkonfigurierten XML-Format zu geben. Das einzige, was mir gelegentlich begegnet, ist die Formatierung neuer Zeilen, aber dann lese ich die Dateien roh. Ansonsten funktioniert das Parsen von XML hervorragend.
quelle
Nun, ich würde sagen, es hängt davon ab, was Sie in den Protokollen sehen möchten, nicht wahr? Wenn Sie mit den Angeboten von ex.Message zufrieden sind, verwenden Sie diese. Verwenden Sie andernfalls ex.toString () oder protokollieren Sie sogar den Stack-Trace.
quelle