Чи є спосіб зробити так, щоб Throwable.printStackTrace(PrintStream s)надрукувати повний стек стека, щоб я міг бачити за кінцевим рядком "... 40 more"?
Чи є спосіб зробити так, щоб Throwable.printStackTrace(PrintStream s)надрукувати повний стек стека, щоб я міг бачити за кінцевим рядком "... 40 more"?
Відповіді:
Вам не потрібно; що інформація присутня в іншому місці трасування стека. З документів printStackTrace():
Зверніть увагу на наявність рядків, що містять символи
"...". Ці рядки вказують на те, що залишок траси стека для цього винятку відповідає зазначеній кількості кадрів внизу траси стека винятку, який був викликаний цим винятком (виняток "що включає").Цей скорочений запис може значно зменшити тривалість виводу в загальному випадку, коли загорнуте виняток викидається з того самого методу, що і "причинний виняток".
Іншими словами, "... x more"єдиний з'являється у ланцюговому винятку, і лише тоді, коли останні xрядки трасування стека вже присутні як частина трасування стека іншого ланцюгового виключення.
Припустимо, що метод ловить виняток Foo, обертає його в Bar винятку і кидає Bar. Тоді трасування стека Foo буде скорочено. Якщо ви з якихось причин хочете повну трасування, все, що вам потрібно зробити, це взяти останній рядок перед ...трасуванням стека у Foo і шукати його в трасі стека Bar; все нижче цього рядка - саме те, що було б надруковано у трасі стека Фу.
Візьмемо трасування стека з документації 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
Причини відображаються від найбільш вкладеного внизу ("основна причина") до того, до якого належить друкований стек.
У цьому випадку першопричиною є те LowLevelException, що спричинило MidLevelException, що спричинило HighLevelException.
Щоб отримати повну трасування стека, вам слід подивитися на кадри, що включають виключення (та його виключення):
Отже, якщо ми хотіли отримати повний слід стека, LowLevelExceptionми зробили б наступне:
MidLevelException)
MidLevelException( HighLevelException)Тоді ваш повний трас стека виглядає так:
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)
Побічні примітки:
Можуть бути випадки, коли в списку немає кадрів, наприклад:
HighLevelException: MidLevelException
at Junk.main(Junk.java:4)
Caused by: MidLevelException
... 1 more
Це може статися , коли причина його створюється в тому ж рядку: new HighLevelException(new MidLevelException()). Не бентежіться цим, описаний вище підхід все ще працює, просто немає кадрів для використання з винятку, продовжуйте його вкладений.
У деяких випадках ви можете заощадити підрахунок, подивившись на перший кадр, який не було пропущено (рядок вище ... X more). Якщо ви знаєте, які методи викликають метод у цьому рядку, ви можете безпосередньо шукати абонентів у рамках виключення, що включає:
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
...- це перший кадр, який відрізняється. Однак він буде принаймні в тому ж класі, який допомагає його знайти.