Jak zwiększyć liczbę wyświetlanych wierszy zrzutu stosu śledzenia Java?


Odpowiedzi:


122

Nie musisz; ta informacja jest obecna w innym miejscu śladu stosu. Z dokumentów printStackTrace():

Zwróć uwagę na obecność linii zawierających znaki "...". Te wiersze wskazują, że pozostała część śladu stosu dla tego wyjątku odpowiada wskazanej liczbie ramek od dołu śladu stosu wyjątku, który został spowodowany przez ten wyjątek (wyjątek „obejmujący”).

Ten skrót może znacznie zmniejszyć długość wyjścia w typowym przypadku, gdy opakowany wyjątek jest wyrzucany z tej samej metody, co przechwytywany „wyjątek przyczynowy”.

Innymi słowy, "... x more"jedyny pojawia się w łańcuchowym wyjątku i tylko wtedy, gdy ostatnie xwiersze śladu stosu są już obecne jako część śladu stosu innego połączonego wyjątku.

Załóżmy, że metoda przechwytuje wyjątek Foo, zawija go w wyjątek Bar i rzuca Bar. Następnie ślad stosu Foo zostanie skrócony. Jeśli z jakiegoś powodu potrzebujesz pełnego śladu, wszystko co musisz zrobić, to wziąć ostatnią linię przed ...śladem stosu w Foo i poszukać jej w śladzie stosu Bar; wszystko poniżej tej linii jest dokładnie tym, co byłoby wydrukowane w śladzie stosu Foo.


Ostatni akapit wprowadza w błąd. Nie będzie żadnego nakładania się, linia poprzedzająca ...to pierwsza klatka, która się różni. Jednak będzie przynajmniej w tej samej klasie, co pomaga go znaleźć.
Marcono1234

5

Szybkie odgadnięcie metody dla Ciebie.

static void printLongerTrace(Throwable t){
    for(StackTraceElement e: t.getStackTrace())
        System.out.println(e);
}

2

Weźmy ślad stosu z dokumentacji 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

Przyczyny są wyświetlane od najbardziej zagnieżdżonej na dole („główna przyczyna”) do tej, do której należy wydrukowany ślad stosu.

W tym przypadku główną przyczyną jest LowLevelException, co spowodowało MidLevelException, które spowodowało HighLevelException.

Aby uzyskać pełny ślad stosu, musisz spojrzeć na ramki otaczającego wyjątku (i otaczających go wyjątków):

  1. Zobacz, ile ramek zostało pominiętych: „... X więcej”
  2. Poszukaj pominiętych ramek w otaczającym wyjątku
    1. Zobacz, ile ramek zostało pominiętych: „... Y więcej”
    2. Dołącz pierwsze ramki X - Y do śladu stosu
  3. Jeśli Y> 0, powtórz krok 2 z liczbą pominiętych ramek

Więc gdybyśmy chcieli uzyskać pełny ślad stosu, wykonalibyśmy LowLevelExceptionnastępujące czynności:

  1. Zobacz, ile ramek zostało pominiętych: „... 3 więcej”
  2. Poszukaj pominiętych ramek w otaczającym wyjątku ( MidLevelException)
    1. 1 ramka została pominięta („... 1 więcej”)
    2. Dołącz pierwsze 2 (3 - 1) ramki do śladu stosu
  3. Powtórz krok 2 z 1 jako liczbą pominiętych ramek
    1. Spójrz na otaczający wyjątek MidLevelException( HighLevelException)
    2. Dołącz pierwszą 1 ramkę do śladu stosu

Twój pełny ślad stosu wygląda wtedy następująco:

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)

Uwagi dodatkowe:

  • Mogą wystąpić przypadki, w których nie ma na liście ramek, np .:

    HighLevelException: MidLevelException
        at Junk.main(Junk.java:4)
    Caused by: MidLevelException
        ... 1 more
    

    Może się to zdarzyć, gdy przyczyną jest tworzony w tej samej linii: new HighLevelException(new MidLevelException()). Nie daj się zmylić, podejście opisane powyżej nadal działa, po prostu nie ma ramek do użycia z wyjątku, kontynuuj z jego obejmującą.

  • W niektórych przypadkach możesz zaoszczędzić sobie liczenia, patrząc na pierwszą klatkę, która nie została pominięta (powyższa linia ... X more). Jeśli wiesz, które metody wywołują metodę w tym wierszu, możesz bezpośrednio szukać wywołań w ramkach otaczającego wyjątku:

    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
    
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.