Java: StringBufferOutputWriter или StringBufferOutputStream? - PullRequest
0 голосов
/ 18 ноября 2009

Мне нужно взять пойманное исключение и получить строку, которая будет напечатана с использованием printStackTrace().

Похоже, что проще всего вызвать printStackTrace(X), где X подклассы PrintStream или PrintWriter, собирает его в StringBuilder и может вернуть String.

Существует ли такая вещь? Если нет, какие-либо предложения, как это сделать?

edit : skaffman опубликовал решение, которое использовало getStackTrace(). (можете ли вы или модераторы восстановить?) Это единственное решение, которое работает "правильно". Проблема использования PrintWriter поверх StringWriter, хотя он работает легко, заключается в том, что для трассировки глубоких стеков он не печатает все элементы.

Ответы [ 3 ]

4 голосов
/ 18 ноября 2009

То, что вы хотите, это StringWriter

Вы можете передать это в конструктор PrintWriter и затем вызвать getBuffer () для StringWriter или toString (), чтобы получить окончательную строку.

2 голосов
/ 18 ноября 2009

Как насчет того, чтобы вместо printStackTrace вы звоните Throwable.getStackTrace(), что возвращает StackTraceElement[]? Вам все еще нужно проделать некоторую работу, чтобы поместить его в строку, но это, возможно, более чистое решение, чем взламывать строковые буферы и тому подобное.

Когда у вас есть StackTraceElement[], вы можете манипулировать этим. Возможно, макет, заданный printStackTrace, не совсем подходит для того, для чего вы собираетесь его использовать, и что более явное форматирование, обеспечиваемое объектной моделью StackTraceElement, дает вам больше контроля. В конце концов, именно это и было предусмотрено.

0 голосов
/ 18 ноября 2009

Guava содержит это в своем классе com.google.common.base.Throwables:

public static String getStackTraceAsString(Throwable throwable) {
  StringWriter sw = new StringWriter();
  throwable.printStackTrace(new PrintWriter(sw));
  return sw.toString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...