Какой самый простой способ преобразовать результат Throwable.getStackTrace()
в строку, изображающую трассировку стека?
java
stack-trace
tostring
ripper234
источник
источник
Ответы:
Можно использовать следующий метод для преобразования
Exception
трассировки стека вString
. Этот класс доступен в Apache commons-lang, наиболее распространенной зависимой библиотеке со многими популярными открытыми источниками.org.apache.commons.lang.exception.ExceptionUtils.getStackTrace(Throwable)
источник
org.apache.commons.lang3.exception.ExceptionUtils
.Используйте
Throwable.printStackTrace(PrintWriter pw)
для отправки трассировки стека соответствующему устройству записи.источник
StringWriter
иPrintWriter
?Это должно работать:
источник
printStackTrace
должно просто вернуть строку, оставляя решение о том, печатать это пользователю или нет :)printXXX()
должен вывести XXX.Если вы разрабатываете для Android, гораздо проще использовать это:
Формат такой же, как у getStacktrace, например,
источник
Log.e("TAG", "My message", new Throwable());
Throwables
Класс гуавыЕсли у вас есть фактический
Throwable
экземпляр, Google Guava предоставляетThrowables.getStackTraceAsString()
.Пример:
источник
ВНИМАНИЕ: Не включает причину (которая обычно является полезным битом!)
источник
String.format("%n")
или что-то подобное вместо того,"\n"
чтобы осчастливить DOS-ламеров.Для меня самым чистым и простым способом было:
источник
источник
StringWriter
иPrintWriter
объекты должны бытьclose
d .... (или я предполагаю , что толькоPrintWriter
должен быть закрыт , так как закрытие она должна закрытьStringWriter
тоже)Следующий код позволяет вам получить весь stackTrace в
String
формате без использования таких API, как log4J или дажеjava.util.Logger
:источник
Вот версия, которую можно копировать прямо в код:
Или в блоке улова
источник
Throwable
определяется, верно?Это самый простой способ преобразовать результат в строку, которую я использую в своей программе для печати трассировки стека
источник
Выведите трассировку стека в a
PrintStream
, затем преобразуйте ее вString
:источник
Печать трассировки стека в строку
Это полезно, когда вы хотите напечатать текущую трассировку стека потоков без создания экземпляра
Throwable
- но учтите, что создание новойThrowable
и получение оттуда трассировки стека на самом деле быстрее и дешевле, чем вызовThread.getStackTrace
.источник
Котлин
Расширение класса Throwable даст вам свойство String
error.stackTraceString
:источник
источник
Умный обстрел в первом наборе комментариев был очень забавным, но это действительно зависит от того, что вы пытаетесь сделать. Если у вас еще нет правильной библиотеки, то 3 строки кода (как в ответе Д. Вроблевского) идеальны. OTOH, если у вас уже есть библиотека apache.commons (как и большинство крупных проектов), то ответ Амара будет короче. ОК, вам может потребоваться десять минут, чтобы получить библиотеку и установить ее правильно (меньше, чем один, если вы знаете, что делаете). Но часы тикают, поэтому у вас может не быть свободного времени. У Ярека Пшигодзки была интересная оговорка - «Если вам не нужны вложенные исключения».
Но что , если я действительно нужен полные трассировки стеки, вложенные и все? В этом случае, секрет заключается в getFullStackTrace использования apache.common (см http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/exception/ExceptionUtils.html # getFullStackTrace% 28java.lang.Throwable% 29 )
Это спасло мой бекон. Спасибо, Амар, за подсказку!
источник
Код из Apache Commons Lang 3.4 ( JavaDoc ):
Разница с другими ответами в том, что он использует
autoFlush
наPrintWriter
.источник
Без
java.io.*
этого можно обойтись так.И тогда
trace
переменная содержит вашу трассировку стека. Выход также содержит первоначальную причину, выход идентиченprintStackTrace()
Пример,
printStackTrace()
дает:trace
Строка выполняется, когда печатаетсяstdout
источник
Scala версия
источник
если вы используете Java 8, попробуйте это
Вы можете найти код для
getStackTrace()
функции, предоставленнойThrowable.java
как:и для
StackTraceElement
, это провайдерыtoString()
как:Так что просто присоединяйтесь к
StackTraceElement
"\ n".источник
описание ответа Гала, в котором также будут указаны причины исключения:
источник
Решением является преобразование stackTrace массива в строковый тип данных. Смотрите следующий пример:
источник
С Java 8 Stream API вы можете сделать что-то вроде этого:
Он возьмет массив элементов трассировки стека, преобразует их в строку и объединяет в многострочную строку.
источник
Мой oneliner для преобразования трассировки стека во вложенную многострочную строку:
Легко перейти на регистратор "как есть".
источник
printStackTrace()
Здесь вы потеряете: 1) Исключение, которое было брошено; 2) Причины и их следы стекаprintStackTrace()
никогда не было частью вопроса.Если вы не хотите использовать внешнюю библиотеку и не разрабатываете для Android , вы можете создать метод «расширения», например:
источник
Старый вопрос, но я просто хотел бы добавить специальный случай, когда вы не хотите печатать всю стопку , удалив некоторые части, которые вам на самом деле не интересны, за исключением определенных классов или пакетов.
Вместо
PrintWriter
использованияSelectivePrintWriter
:Где
SelectivePrintWriter
класс дается:Обратите внимание, что этот класс может быть легко адаптирован для фильтрации по Regex
contains
или другим критериям. Также обратите внимание, что это зависит отThrowable
деталей реализации (вряд ли изменится, но все же).источник
Когда вы запустите программу, результат будет примерно таким:
источник
Интересно, почему никто не упомянул
ExceptionUtils.getStackFrames(exception)
Для меня это самый удобный способ вывести стек трассировки со всеми причинами до конца:
источник
Предупреждение: это может быть немного не по теме, ну да ладно ...;)
Я не знаю, какова была причина первоначальных постеров для того, чтобы в первую очередь желать трассировки стека как строки. Когда трассировка стека должна заканчиваться в SLF4J / Logback LOG, но не было и не должно быть выброшено вот что я делаю:
Мне это нравится, потому что для него не требуется внешняя библиотека (кроме вашего бэкэнда для ведения журналов, который, конечно же, будет в большинстве случаев установлен).
источник
Несколько вариантов
StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); String exceptionAsString = sw.toString();
Использование Google Guava lib
String stackTrace = Throwables.getStackTraceAsString ( myException ) ;
org.apache.commons.lang.exception.ExceptionUtils.getStackTrace (Throwable)
источник