Как сохранить printStackTrace в строку

Как я могу получить e.printStackTrace() и сохранить его в переменной String? Я хочу использовать строку, сгенерированную e.printStackTrace() позже в моей программе.

Я все еще новичок в Java, поэтому я не слишком хорошо знаком с StringWriter, что я думаю будет решением. Или, если у вас есть другие идеи, пожалуйста, дайте мне знать. Благодаря

Ответ 1

Что-то вдоль линий

StringWriter errors = new StringWriter();
ex.printStackTrace(new PrintWriter(errors));
return errors.toString();

Должно быть то, что вам нужно.

Соответствующая документация:

Ответ 2

Guava упрощает работу с Throwables.getStackTraceAsString( Throwable):

Exception e = ...
String stackTrace = Throwables.getStackTraceAsString(e);

Внутри это делает то, что предлагает @Zach L.

Ответ 3

Вы должны использовать метод getStackTrace () вместо printStackTrace(). Вот хороший пример:

import java.io.*;

/**
* Simple utilities to return the stack trace of an
* exception as a String.
*/
public final class StackTraceUtil {

  public static String getStackTrace(Throwable aThrowable) {
    final Writer result = new StringWriter();
    final PrintWriter printWriter = new PrintWriter(result);
    aThrowable.printStackTrace(printWriter);
    return result.toString();
  }

  /**
  * Defines a custom format for the stack trace as String.
  */
  public static String getCustomStackTrace(Throwable aThrowable) {
    //add the class name and any message passed to constructor
    final StringBuilder result = new StringBuilder( "BOO-BOO: " );
    result.append(aThrowable.toString());
    final String NEW_LINE = System.getProperty("line.separator");
    result.append(NEW_LINE);

    //add each element of the stack trace
    for (StackTraceElement element : aThrowable.getStackTrace() ){
      result.append( element );
      result.append( NEW_LINE );
    }
    return result.toString();
  }

  /** Demonstrate output.  */
  public static void main (String... aArguments){
    final Throwable throwable = new IllegalArgumentException("Blah");
    System.out.println( getStackTrace(throwable) );
    System.out.println( getCustomStackTrace(throwable) );
  }
} 

Ответ 4

Вдоль линий Гуавы Apache Commons Lang имеет ExceptionUtils.getFullStackTrace в org.apache.commons.lang.exception. Из предыдущего ответа в StackOverflow.

Ответ 6

StackTraceElement[] stack = new Exception().getStackTrace();
String theTrace = "";
for(StackTraceElement line : stack)
{
   theTrace += line.toString();
}

Ответ 7

Используйте apache commons-lang3 lib

import org.apache.commons.lang3.exception.ExceptionUtils;

//...

String[] ss = ExceptionUtils.getRootCauseStackTrace(e);
logger.error(StringUtils.join(ss, System.lineSeparator()));

Ответ 8

call:  getStackTraceAsString(sqlEx)

public String getStackTraceAsString(Exception exc)  
{  
String stackTrace = "*** Error in getStackTraceAsString()";

ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream( baos );
exc.printStackTrace(ps);
try {
    stackTrace = baos.toString( "UTF8" ); // charsetName e.g. ISO-8859-1
    } 
catch( UnsupportedEncodingException ex )
    {
    Logger.getLogger(sss.class.getName()).log(Level.SEVERE, null, ex);
    }
ps.close();
try {
    baos.close();
    } 
catch( IOException ex )
    {
    Logger.getLogger(sss.class.getName()).log(Level.SEVERE, null, ex);
    }
return stackTrace;
}