Dies ist die eigentliche Quelle für .NET System.Exception.ToString
:Warum ruft System.Exception.ToString virtuellen ToString nicht für innere Ausnahmen auf?
public override string ToString()
{
return this.ToString(true, true);
}
private string ToString(bool needFileLineInfo, bool needMessage)
{
string str1 = needMessage ? this.Message : (string) null;
string str2 = str1 == null || str1.Length <= 0 ? this.GetClassName() : this.GetClassName() + ": " + str1;
if (this._innerException != null)
str2 = str2 + " ---> " + this._innerException.ToString(needFileLineInfo, needMessage) + Environment.NewLine + " " + Environment.GetRuntimeResourceString("Exception_EndOfInnerExceptionStack");
string stackTrace = this.GetStackTrace(needFileLineInfo);
if (stackTrace != null)
str2 = str2 + Environment.NewLine + stackTrace;
return str2;
}
Neben der schieren Hässlichkeit, kann man die feststellen, für alle inneren Ausnahmen das private, nicht-virtuelle ToString aufgerufen wird. Mit anderen Worten, wenn Sie ToString
in Ihrer Ausnahme überlasten, wird es nicht aufgerufen, wenn Ihre Ausnahme verschachtelt ist. Oh, festhalten, stellt sich heraus, eingebaute Ausnahmen haben die gleichen Probleme, z.B. System.IO.FileNotFoundException
druckt Pfad der Datei - es ist nicht ein Teil der Nachricht ist:
public override string ToString()
{
string str = this.GetType().FullName + ": " + this.Message;
if (this._fileName != null && this._fileName.Length != 0)
str = str + Environment.NewLine + Environment.GetResourceString("IO.FileName_Name", new object[1]
{
(object) this._fileName
});
...
}
Aber wenn Sie eine Instanz wickeln ... diese Informationen gehen verloren, wenn Sie die Ausnahmen Baum selbst und erkennen Ausnahmen durchqueren Geben Sie ToString
ein oder rufen Sie sich selbst an und führen Sie ein banales Parsing durch.
Das ist eine lästige Unannehmlichkeit, die dazu führt, dass Protokoll-/Schreibfehler-Dialoge entweder Informationen verlieren oder fehleranfällig sind. Interessanterweise Mono gets it right.
Gibt es irgendeine versteckte Weisheit in der .NET-Version?
EDIT: Dies ist keine Meinung basierte Frage. Während ich diese Designauswahl als ärgerlich empfinde, würde ich gerne die Vorteile dieses Ansatzes kennenlernen. Sie zu kennen, kann bei der Entwicklung neuer Lösungen von Vorteil sein.
Ich verstehe Ihren Punkt, aber beachten Sie, dass die Präsentation von Ausnahme-Stack und/oder Call-Stack für den Benutzer ein Sicherheits-Rick sein kann. Ganz zu schweigen davon, dass der Standard 'ToString' auch die Eigenschaft 'Message' ausgibt, die sensible Daten enthalten kann. Wenn es sich also um eine bewusste Microsoft-Designentscheidung handelte, war es ein Mittelgrund, der weder der Sicherheit noch der Informativität diente. Für "Retail" -Programme sollte man das Ergebnis von 'ToString' gar nicht zeigen, für Inhouse-Tech braucht man mehr Informationen (es ist da draußen!). – gwiazdorrr