J'utilise la classe Logger
de Java. Je veux passer ex.printStackTrace()
dans Logger.log(loglevel, String)
, mais printStackTrace()
renvoie void
. Je ne peux donc pas transmettre et imprimer la trace de pile de l'exception.
Existe-t-il un moyen de convertir void
en String
ou existe-t-il d'autres méthodes permettant d'imprimer la trace entière de la pile d'exceptions?
Vous devez comprendre que void
est en fait nothingness
. Vous ne pouvez pas convertir ce qui n'est rien. Vous pourriez finir par imprimer void
sous forme de chaîne, mais (croyez-moi), vous ne le souhaitez pas.
Je pense que ce que vous cherchez, c'est
// assuming ex is your Exception object
logger.error(ex.getMessage(), ex);
// OR
Logger.log(errorLogLevel, ex.getMessage(), ex)
Cela imprimera le message d'erreur à l'aide du consignateur que vous avez configuré. Pour plus de détails, vous pouvez consulter la documentation Java pour Exception # getMessage ()
Utilisez Java.util.logging.Logger#log(Level, String, Throwable)
et transmettez ex
comme troisième argument comme ceci:
LOGGER.log(Level.INFO, ex.getMessage(), ex);
Vous ne pouvez pas convertir void
en String
; une telle conversion n'existe pas. void
ne renvoie pas rien, vous n'avez donc aucune valeur à récupérer.
Ce que vous voulez probablement faire, c'est recevoir le message de l'exception à la place via ex.getMessage()
.
Une autre alternative serait aussi:
log.error("Exception : "+ExceptionUtils.getFullStackTrace(e));
Vous pouvez utiliser la méthode getStackTrace () pour obtenir un tableau de StackTraceElements et générer une chaîne à partir de là. Sinon, si seul le dernier message d'erreur est suffisant, utilisez la méthode getMessage()
proposée par Makoto.
Pour obtenir la trace de pile sous la forme String
à partir d'un tableau d'objets StackTraceElement
, vous devez effectuer une itération sur le tableau (extrait du source JDK7):
StringBuilder builder = new StringBuilder();
StackTraceElement[] trace = getOurStackTrace();
for (StackTraceElement traceElement : trace)
builder.append("\tat " + traceElement + "\n");
Une autre option consiste à utiliser printStackTrace(PrintStream s)
, où vous pouvez spécifier l'endroit où vous voulez que le stacktrace soit imprimé:
ByteArrayOutputStream out1 = new ByteArrayOutputStream();
PrintStream out2 = new PrintStream(out1);
ex.printStackTrace(out2);
String message = out1.toString("UTF8");
Avec le format ci-dessous, vous pouvez avoir la trace de la pile:
Java.util.logging.SimpleFormatter.format=%1$tF %1$tT [%4$-7s][%2$s] %5$s %6$s%n
Le point dans ce modèle est% 6 $ s. Il va imprimer la trace de la pile.
Merci à tous. Je peux enregistrer les détails de la trace de la pile à l'aide de
LOGGER.log(Level.INFO, ex.getMessage(),ex);
//ex is my exception object
Comme le dit Makoto, vous voudrez probablement faire un ex.getMessage ().
Pour clarifier davantage, void
signifie qu'il n'y a rien retourné. Vous ne pouvez rien jeter dans quelque chose :)
vous POUVEZ convertir stacktrace en String en utilisant ci-dessous. Si e
est l'objet exception
StringWriter stringWriter= new StringWriter();
PrintWriter printWriter= new PrintWriter(stringWriter);
e.printStackTrace(printWriter);
String stackTraceAsString= stringWriter.toString();
Il existe une méthode printStackTrace surchargée qui prend un PrintWriter.
Vous pouvez faire quelque chose comme ça
Writer buffer = new StringWriter();
PrintWriter pw = new PrintWriter(buffer);
ex.printStackTrace(pw);
Logger.log(loglevel, buffer.toString());