Мне нравится пример, найденный здесь :
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
В основном в исходном коде main
вызывает function a
, который вызывает function b
, который вызывает ... который вызывает function e
.
Function e
выдает LowLevelException
, в результате чего функция c перехватывает LowLevelException
и выбрасывает MidLevelException
(оборачивая экземпляр LowLevelException
внутри экземпляра MidLevelException
. Класс Exception
имеет конструктор, который способен принять в другое исключение, завернув его). Это заставляет функцию a перехватывать MidLevelException
и генерировать HighLevelException
, который теперь оборачивает два предыдущих экземпляра Exception
.
Как отмечалось в других ответах, трассировка стека на самом деле не усекается, вы видите полную трассировку стека. .. .3 more
в моем примере есть, потому что в противном случае оно будет избыточным. Если вы хотите использовать избыточные и лишние выходные строки, .. 3 more
можно заменить на
at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
at Junk.main(Junk.java:4)
Но нет необходимости выводить эти три строки, потому что они уже подразумеваются.