Научитесь преобразовывать трассировку стека исключений Java в строку. Преобразование из StackTrace в строку может быть полезным, когда мы хотим распечатать трассировки стека в файлах журналов или сохранить журналы в базе данных для целей аудита.
Обратите внимание, что Java не имеет встроенного прямого API для получения трассировки стека в виде строки.
1. Использование StringWriter и PrintWriter
По умолчанию Throwable.printStackTrace() выводит трассировку исключения в стандартный поток ошибок, который является значением поля System.err. По умолчанию System.err выводится на консоль.
Мы можем использовать перегруженный метод printStackTrace(writer) для печати обратной трассировки в указанный print Writer, такой как PrintWriter. Этот PrintWriter нацелен на StringWriter.
Чтобы преобразовать трассировку стека с помощью StringWriter, выполните следующие действия.
- Распечатать трассировку стека, которую можно вывести, и ее обратную трассировку в PrintWriter.
- Копировать содержимое средства записи печати в StringWriter.
- Используйте StringWriter.toString() для получения трассировки стека в виде строки.
Мы используем try-with-resource для создания экземпляров StringWriter и PrintWriter, которые автоматически закрывают оба объекта записи после завершения обработки.
В следующей программе мы создаем исключение NullPointerException и выводим его трассировку стека после преобразования в строку.
NullPointerException npe = new NullPointerException("Custom error");String errorStr = null;try(StringWriter sw = new StringWriter();PrintWriter pw = new PrintWriter(sw)) {npe.printStackTrace(pw);errorStr = sw.toString();} catch(IOException e) {throw new RuntimeException("Error while converting the stacktrace");}System.out.println(errorStr);
Вывод программы.
java.lang.NullPointerException: Custom errorat com.howtodoinjava.demo.StackTrace.main(StackTrace.java:11)
2. Использование ExceptionUtils
В библиотеке Apache common langs3 есть один отличный служебный класс ExceptionUtils. Его метод getStackTrace() возвращает строковое представление любого исключения Java.
2.1.Мавен
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency>
2.2 Пример
Следующая программа Java копирует трассировку стека в строку.
String errorStr = ExceptionUtils.getStackTrace(new NullPointerException("Custom error"));System.out.println(errorStr);
Вывод программы.
java.lang.NullPointerException: Custom errorat com.howtodoinjava.demo.StringExample.main(StringExample.java:11)