Vom Inhalt von Exception.StackTrace verwirrt

8

Angenommen, ich habe die folgende Situation:

%Vor%

Ich starte es und habe folgende Ausgabe:

%Vor%

Wenn ich das Kommentarzeichen auslasse, wird eine neue Exception geworfen ("Case 1"); Die Ausgabe ist:

%Vor%

Meine Frage ist also, warum ich im ersten Fall den vollständigen Pfad einschließlich der Hauptfunktion sehen kann, während ich im zweiten Fall nicht dasselbe sehe. Wie kann ich die vollständigeren Informationen anzeigen, wenn der Produktionscode dem zweiten Fall ähnlich ist?

    
Eugeniu Torica 17.03.2011, 17:29
quelle

3 Antworten

1

Im ersten Fall führen Sie einen weiteren Methodenaufruf für die anonyme Methode aus, die in der Methode Main definiert ist. Da die Ausnahme in der anonymen Methode ausgelöst wird, ist sie in der Aufrufliste enthalten.

Wenn Sie die Ausnahme in der WrapperMethod -Methode auslösen, ist die anonyme Methode niemals beteiligt, daher wird sie nicht im Aufruf-Stack angezeigt.

    
Guffa 17.03.2011, 17:40
quelle
7

Was Sie in Ihrem Stack-Trace sehen, ist der generierte Name des Compilers für die anonyme Funktion, die Sie in WrapperMethod übergeben. Es gibt keine Möglichkeit, in dieser Situation einen "schöneren Namen" zu erhalten, ohne anonyme Funktionen zu verwenden.

Wenn Sie das jedoch wissen, sollte es nicht schwierig sein, den verstümmelten Stack Trace "mental zu analysieren". Sie können die anonyme Funktion anhand ihres Namens erkennen, der etwa so aussieht wie <Main>b__0() , und Sie können erkennen, dass sie in der Program -Klasse deklariert wurde, da der Compiler sich entschieden hat, die Funktion zu generieren.

Sie verlieren keine Stapelinformationen. Wenn eine Ausnahme in WrapperFunction geworfen wird, ist dies der oberste Stapelrahmen. Wenn eine Ausnahme in einer von WrapperFunction aufgerufenen Methode ausgelöst wird, befindet sich die (in diesem Fall eine anonyme) Methode im Stapel oben.

    
driis 17.03.2011 17:35
quelle
0

Sie sehen nur den Stack-Trace, wie er ist, nicht mehr und nicht weniger.

Der Grund ist, dass Lambda-Ausdrücke jitter sind, wenn sie ausgeführt werden müssen, und davor werden sie nur in Form von Daten gespeichert.

    
Aliostad 17.03.2011 17:39
quelle

Tags und Links