Gibt es eine Möglichkeit, Throwable.printStackTrace(PrintStream s)
den vollständigen Stapel-Trace zu drucken, damit ich über die letzte Zeile von hinaus sehen kann "... 40 more"
?
Gibt es eine Möglichkeit, Throwable.printStackTrace(PrintStream s)
den vollständigen Stapel-Trace zu drucken, damit ich über die letzte Zeile von hinaus sehen kann "... 40 more"
?
Antworten:
Du musst nicht; Diese Informationen sind an anderer Stelle in der Stapelverfolgung vorhanden. Aus den Dokumenten von printStackTrace()
:
Beachten Sie das Vorhandensein von Zeilen, die die Zeichen enthalten
"..."
. Diese Zeilen geben an, dass der Rest der Stapelverfolgung für diese Ausnahme mit der angegebenen Anzahl von Frames am unteren Rand der Stapelverfolgung der Ausnahme übereinstimmt, die durch diese Ausnahme verursacht wurde (die "einschließende" Ausnahme).Diese Abkürzung kann die Länge der Ausgabe in dem allgemeinen Fall, in dem eine umschlossene Ausnahme von derselben Methode ausgelöst wird, mit der die "verursachende Ausnahme" abgefangen wird, erheblich reduzieren.
Mit anderen Worten, die "... x more"
einzige wird nur in einer verketteten Ausnahme angezeigt und nur dann, wenn die letzten x
Zeilen der Stapelverfolgung bereits als Teil der Stapelverfolgung einer anderen verketteten Ausnahme vorhanden sind.
Angenommen, eine Methode fängt die Ausnahme Foo ab, umschließt sie mit der Ausnahmeleiste und löst die Leiste aus. Dann wird die Stapelspur von Foo gekürzt. Wenn Sie aus irgendeinem Grund die vollständige Ablaufverfolgung wünschen, müssen Sie nur die letzte Zeile vor der ...
Stapelverfolgung in Foo nehmen und sie in der Stapelverfolgung in der Leiste suchen. Alles unter dieser Zeile ist genau das, was in Foos Stack-Trace gedruckt worden wäre.
Nehmen wir den Stack-Trace aus der Dokumentation von Throwable.printStackTrace () :
HighLevelException: MidLevelException: LowLevelException
at Junk.a(Junk.java:13)
at Junk.main(Junk.java:4)
Caused by: MidLevelException: LowLevelException
at Junk.c(Junk.java:23)
at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
... 1 more
Caused by: LowLevelException
at Junk.e(Junk.java:30)
at Junk.d(Junk.java:27)
at Junk.c(Junk.java:21)
... 3 more
Die Ursachen werden von der am meisten verschachtelten unten (der "Grundursache") bis zu der Ursache angezeigt, zu der die gedruckte Stapelverfolgung gehört.
In diesem Fall ist die Grundursache LowLevelException
, welche Ursache MidLevelException
, welche Ursache HighLevelException
.
Um den vollständigen Stack-Trace zu erhalten, müssen Sie sich die Frames der einschließenden Ausnahme (und ihrer einschließenden Ausnahmen) ansehen:
Wenn wir also den vollständigen Stack-Trace von erhalten LowLevelException
möchten, würden wir Folgendes tun:
MidLevelException
)
MidLevelException
( HighLevelException
) an.Ihre vollständige Stapelverfolgung sieht dann folgendermaßen aus:
LowLevelException
at Junk.e(Junk.java:30)
at Junk.d(Junk.java:27)
at Junk.c(Junk.java:21)
// From MidLevelException stack trace
at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
// From HighLevelException stack trace
at Junk.main(Junk.java:4)
Randnotizen:
Es kann Fälle geben, in denen keine Frames aufgelistet sind, z.
HighLevelException: MidLevelException
at Junk.main(Junk.java:4)
Caused by: MidLevelException
... 1 more
Dies kann passieren, wenn die Ursache in derselben Zeile liegt : new HighLevelException(new MidLevelException())
. Lassen Sie sich davon nicht verwirren, der oben beschriebene Ansatz funktioniert immer noch. Es gibt nur keine Frames, die von der Ausnahme verwendet werden können. Fahren Sie mit dem einschließenden fort.
In einigen Fällen können Sie sich das Zählen ersparen, indem Sie sich den ersten Frame ansehen, der nicht ausgelassen wurde (die obige Zeile ... X more
). Wenn Sie wissen, welche Methoden die Methode in dieser Zeile aufrufen, können Sie direkt nach den Aufrufern in den Frames der einschließenden Ausnahme suchen:
HighLevelException: MidLevelException: LowLevelException
at Junk.c(Junk.java:29)
at Junk.b(Junk.java:21)
at Junk.a(Junk.java:13)
at Junk.main(Junk.java:4)
Caused by: MidLevelException
// You know Junk.d is only called by Junk.b
at Junk.d(Junk.java:35)
... 3 more
...
ist das erste Bild, das sich unterscheidet. Es wird jedoch zumindest in derselben Klasse sein, was hilft, es zu finden.