Какие элементы StackTraceElements возвращает «new Throwable (). GetStackTrace ()»?

Причина, по которой я спрашиваю, какие StackTraceElements возвращаются new Throwable().getStackTrace(), заключается в том, что метод Древесина # getTag предполагает, что 6-й элемент StackTraceElement является источником журнала ... например: new Throwable().getStackTrace()[5] == MainFragment Class или new Throwable().getStackTrace()[5] == Logging Class

Примечание: new Throwable().getStackTrace() вызывается по адресу Древесина # getTag, а не там, где мы ведем журнал. Во время регистрации мы иногда даже не передаем Метательный (Timber.d("Fetching restaurants."))

Это что-то ужасно ненадежное. Я видел и то, и другое, конструктор Throwable() включенный и исключенный, в дикой природе. Однажды я увидел даже Throwable.fillInStackTrace(), вызываемый конструктором, включенным в трассировку стека. Если вы хотите использовать этот способ для определения вызывающего, вы должны проверить фактические кадры стека в массиве, чтобы сначала идентифицировать себя, а затем предположить, что следующая запись будет вызывающей (хотя нет стандарта относительно того, как обрабатывать отражающие вызовы ).

Holger 05.11.2018 11:44

спасибо @Holger. Я давно не занимался Java, чтобы понять его сложные внутренние детали, но у меня довольно обширные знания схожих языков, и я могу сказать, когда вижу, что что-то делается в обратном направлении ...

McKabue 05.11.2018 13:22

К сожалению, содержимое массива трассировки стека никогда не было точно указано, даже хуже того, в документации явно упоминается возможность того, что конкретная реализация может пропускать кадры стека по каким-либо техническим причинам. Потребовалось до Java 9, прежде чем был представлен стандартный способ программного исследования стека или просто получения непосредственного вызывающего объекта (API StackWalker). Этот API также позволяет указать, следует ли пропускать кадры отражения и т. д. Но я полагаю, это еще не вошло в Android API.

Holger 05.11.2018 14:02
0
3
72
0

Другие вопросы по теме