Преобразование stack trace в строку на Java — StringWriter и PrintWriter

Иногда нужно записать стек вызовов исключения не в консоль, а в строку — например, чтобы отправить в лог-файл или по сети. В Java для этого используют связку StringWriter и PrintWriter.

Чтобы понять этот пример, нужно знать:

  • Строки в Java

  • Обработка исключений в Java

Пример: преобразование stack trace в строку

import java.io.PrintWriter;
import java.io.StringWriter;

public class PrintStackTrace {

    public static void main(String[] args) {

        try {
            int division = 0 / 0;
        } catch (ArithmeticException e) {
            StringWriter sw = new StringWriter();
            e.printStackTrace(new PrintWriter(sw));
            String exceptionAsString = sw.toString();
            System.out.println(exceptionAsString);
        }
    }
}

Вывод:

java.lang.ArithmeticException: / by zero
    at PrintStackTrace.main(PrintStackTrace.java:9)

В этой программе мы намеренно вызвали ArithmeticException делением 0 на 0. В блоке catch мы создаём StringWriter и PrintWriter, которые принимают любой текстовый вывод и направляют его в строку. Метод printStackTrace() исключения «печатает» стек вызовов в наш PrintWriter, после чего мы получаем результат через toString().

Совет

Этот приём полезен для логирования: вместо e.printStackTrace() в консоль вы можете отправить полученную строку в файл, базу данных или систему мониторинга.