1. Введение
Имея дело с исключениями в Java, мы часто регистрируем или просто отображаем трассировку стека. Однако иногда мы не хотим просто печатать трассировку стека, нам может потребоваться записать трассировку стека в файл, в базу данных или даже передать ее по сети.
Для этих целей было бы очень полезно иметь трассировку стека в виде строки .
И, к сожалению, Java не предоставляет очень удобного способа сделать это напрямую.
2. Преобразование с помощью Core Java
Начнем с основной библиотеки.
Функция printStackTrace()
класса Exception
может принимать один параметр: PrintStream
или PrintWriter
. Таким образом, используя StringWriter
, можно распечатать трассировку стека в String
:
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
Затем вызов sw.toString()
вернет трассировку стека в виде строки
.
3. Преобразование с помощью Commons-Lang
Хотя предыдущий метод является самым простым способом преобразования трассировки стека в строку
с использованием ядра Java, он остается немного громоздким. К счастью, Apache Commons-Lang предоставляет функцию, выполняющую эту работу.
Apache Commons-Lang — очень полезная библиотека, предлагающая множество функций, отсутствующих в основных классах Java API, включая классы, которые можно использовать для работы с исключениями.
Во-первых, давайте начнем с конфигурации проекта. При использовании Maven нам просто нужно добавить следующую зависимость в pom.xml
:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
Затем, в нашем случае, наиболее интересным является класс ExceptionUtils
, предоставляющий функции для управления исключениями. Используя этот класс, получить трассировку стека в виде строки
из исключения
довольно просто:
String stacktrace = ExceptionUtils.getStackTrace(e);
4. Вывод
Получить трассировку стека исключения в виде строки
несложно, но далеко не интуитивно. В этой статье представлены два способа сделать это: либо с помощью ядра Java, либо с помощью Apache Commons-Lang.
Имейте в виду, что в Java 9 появится новый API StackWalking, который должен упростить задачу.
Как всегда, образцы кода можно найти здесь, на GitHub .