Перейти к основному содержимому

Преобразование трассировки стека в строку в Java

· 2 мин. чтения

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 .