web-dev-qa-db-fra.com

Comment stocker printStackTrace dans une chaîne

Comment obtenir la e.printStackTrace() et la stocker dans une variable String? Je veux utiliser la chaîne générée par e.printStackTrace() plus tard dans mon programme.

Je suis toujours nouveau dans Java donc je ne connais pas trop StringWriter qui, à mon avis, sera la solution. Ou si vous avez d'autres idées s'il vous plaît faites le moi savoir. Merci

205
ace

Quelque chose dans le sens de

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

Devrait être ce dont vous avez besoin.

Documentation pertinente:

429
Zach L

Guava facilite les choses avec Throwables.getStackTraceAsString (Throwable) :

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

En interne, cela correspond à ce que suggère @Zach L.

71
ColinD

Apache Commons Lang, comme Guava, a ExceptionUtils.getFullStackTrace dans org.Apache.commons.lang.exception. d'une réponse précédente sur StackOverflow.

14
Mihai Danila

Vous pouvez utiliser la ExceptionUtils.getStackTrace(Throwable t); d'Apache Commons 3 class org.Apache.commons.lang3.exception.ExceptionUtils.

http://commons.Apache.org/proper/commons-lang/

ExceptionUtils.getStackTrace (Throwable t)

Exemple de code:

try {

  // your code here

} catch(Exception e) {
  String s = ExceptionUtils.getStackTrace(e);
}
14
thiagoh

Vous devez utiliser la méthode getStackTrace () au lieu de printStackTrace(). Voici un bon exemple :

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) );
  }
} 
13
user405725
StackTraceElement[] stack = new Exception().getStackTrace();
String theTrace = "";
for(StackTraceElement line : stack)
{
   theTrace += line.toString();
}
6
Jonathon Faust

Utilisez la librairie Apache commons-lang3

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

//...

String[] ss = ExceptionUtils.getRootCauseStackTrace(e);
logger.error(StringUtils.join(ss, System.lineSeparator()));
2
Eric Wang
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;
}
1
Stan Towianski