Warum wird der obere Teil des Stapels (in Exception.StackTrace) abgeschnitten? Nehmen wir ein einfaches Beispiel sehen:Warum wird der Stack in Exception.StackTrace abgeschnitten?
public void ExternalMethod()
{
InternalMethod();
}
public void InternalMethod()
{
try
{
throw new Exception();
}
catch(Exception ex)
{
// ex.StackTrace here doesn't contain ExternalMethod()!
}
}
Es scheint, wie dieses "by design" ist. Was sind die Gründe für solch ein seltsames Design? Es macht das Debuggen nur komplexer, weil ich in Log-Nachrichten nicht verstehen kann, wer InternalMethod() aufgerufen hat, und oft sind diese Informationen sehr notwendig.
Wie für Lösungen (für diejenigen, die nicht wissen), gibt es zwei allgemeine Lösungen wie ich sie verstehe:
1) Wir statische Eigenschaft Environment.StackTrace anmelden können, die den ganzen Stapel enthält (zum Beispiel beim Starten die höchste Ebene (Nachrichtenwarteschlange) und endet bei der tiefsten Methode, bei der die Ausnahme auftritt.
2) Wir müssen Ausnahmen auf höchster Ebene abfangen und protokollieren. Wenn wir Ausnahmen auf niedrigeren Ebenen abfangen müssen, um etwas zu tun, müssen wir es (mit "throw" -Anweisung in C#) weiter nach oben werfen.
Aber die Frage ist über Gründe für ein solches Design.
Warum sollte sich ein Objekt darum kümmern, wer es angerufen hat? Ihr Punkt (2), in dem die Ausnahme neu geworfen werden sollte, ist der richtige Ansatz. –
Hauptsächlich Stack-Trace-Informationen sind mit Ausnahme für Debugging-Zwecke enthalten. Mit vorhandenem Design hilft es nicht so sehr beim Debuggen, als wenn es auch einen höheren Teil des Stacks hätte. Denn, ich wiederhole es noch einmal, zu wissen, wer die Methode aufgerufen hat, kann sehr nützlich für das Debugging sein. – nightcoder