Wie drucke ich den Stack-Trace einer Ausnahme in einen anderen Stream als stderr? Eine Möglichkeit, die ich gefunden habe, besteht darin, getStackTrace () zu verwenden und die gesamte Liste in den Stream zu drucken.
Wenn Sie eine Ausnahmeverfolgung als getStackTraceZeichenfolge abrufen möchten, können Sie die Methode Trowable (die Ausnahme) aufrufen, die ein Array von StackTraceElementObjekten zurückgibt , die Sie zu einer Zeichenfolge kombinieren können (mithilfe der toString-Methode dieses Objekts, um eine Zeile einer Ablaufverfolgung abzurufen).
jcubic
Antworten:
61
Throwable.printStackTrace(..)kann ein PrintWriteroder PrintStreamArgument nehmen:
Diese Antwort sieht zwar sehr richtig aus, ist aber keine Antwort auf die Frage. OP fragte, wie er den Stack-Trace in einen anderen Stream drucken könne.
Buurman
Auch wenn dies die Frage von OP möglicherweise nicht beantwortet, denke ich, dass dies der beste Weg ist, eine Ausnahme als String in einem sehr gut etablierten Format zu haben. Vielen Dank!
Clint Eastwood
7
Ich habe eine Methode erstellt, die beim Abrufen von stackTrace hilft:
privatestatic String getStackTrace(Exception ex){
StringBuffer sb = new StringBuffer(500);
StackTraceElement[] st = ex.getStackTrace();
sb.append(ex.getClass().getName() + ": " + ex.getMessage() + "\n");
for (int i = 0; i < st.length; i++) {
sb.append("\t at " + st[i].toString() + "\n");
}
return sb.toString();
}
Die Throwable- Klasse bietet zwei benannte Methoden printStackTrace, eine, die a akzeptiert, PrintWriterund eine, die a akzeptiert, und PrintStreamdie den Stack-Trace an den angegebenen Stream ausgibt. Erwägen Sie die Verwendung einer dieser Optionen.
Wenn Sie an einer kompakteren Stapelverfolgung mit weiteren Informationen (Paketdetails) interessiert sind, die wie folgt aussieht:
java.net.SocketTimeoutException:Receive timed out
at j.n.PlainDatagramSocketImpl.receive0(Native Method)[na:1.8.0_151]
at j.n.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:143)[^]
at j.n.DatagramSocket.receive(DatagramSocket.java:812)[^]
at o.s.n.SntpClient.requestTime(SntpClient.java:213)[classes/]
at o.s.n.SntpClient$1.call(^:145)[^]
at ^.call(^:134)[^]
at o.s.f.SyncRetryExecutor.call(SyncRetryExecutor.java:124)[^]
at o.s.f.RetryPolicy.call(RetryPolicy.java:105)[^]
at o.s.f.SyncRetryExecutor.call(SyncRetryExecutor.java:59)[^]
at o.s.n.SntpClient.requestTimeHA(SntpClient.java:134)[^]
at ^.requestTimeHA(^:122)[^]
at o.s.n.SntpClientTest.test2h(SntpClientTest.java:89)[test-classes/]
at s.r.NativeMethodAccessorImpl.invoke0(Native Method)[na:1.8.0_151]
getStackTrace
Zeichenfolge abrufen möchten, können Sie die Methode Trowable (die Ausnahme) aufrufen, die ein Array vonStackTraceElement
Objekten zurückgibt , die Sie zu einer Zeichenfolge kombinieren können (mithilfe der toString-Methode dieses Objekts, um eine Zeile einer Ablaufverfolgung abzurufen).Antworten:
Throwable.printStackTrace(..)
kann einPrintWriter
oderPrintStream
Argument nehmen:} catch (Exception ex) { ex.printStackTrace(new java.io.PrintStream(yourOutputStream)); }
Erwägen Sie jedoch die Verwendung einer Logger-Schnittstelle wie SLF4J mit einer Protokollierungsimplementierung wie LOGBack oder log4j .
quelle
Nicht schön, aber dennoch eine Lösung:
StringWriter writer = new StringWriter(); PrintWriter printWriter = new PrintWriter( writer ); exception.printStackTrace( printWriter ); printWriter.flush(); String stackTrace = writer.toString();
quelle
Es gibt eine alternative Form von Throwable.printStackTrace (), die einen Druckstrom als Argument verwendet. http://download.oracle.com/javase/6/docs/api/java/lang/Throwable.html#printStackTrace(java.io.PrintStream)
Z.B
catch(Exception e) { e.printStackTrace(System.out); }
Dadurch wird die Stapelverfolgung anstelle des Standardfehlers als Standard ausgegeben.
quelle
Für die Android Dev Minimalisten:
Log.getStackTraceString(exception)
quelle
Apache Commons bietet ein Dienstprogramm zum Konvertieren des Stack-Trace von Throwable in String.
Verwendung:
Eine vollständige Dokumentation finden Sie unter https://commons.apache.org/proper/commons-lang/javadocs/api-release/index.html
quelle
Ich habe eine Methode erstellt, die beim Abrufen von stackTrace hilft:
private static String getStackTrace(Exception ex) { StringBuffer sb = new StringBuffer(500); StackTraceElement[] st = ex.getStackTrace(); sb.append(ex.getClass().getName() + ": " + ex.getMessage() + "\n"); for (int i = 0; i < st.length; i++) { sb.append("\t at " + st[i].toString() + "\n"); } return sb.toString(); }
quelle
Die Throwable- Klasse bietet zwei benannte Methoden
printStackTrace
, eine, die a akzeptiert,PrintWriter
und eine, die a akzeptiert, undPrintStream
die den Stack-Trace an den angegebenen Stream ausgibt. Erwägen Sie die Verwendung einer dieser Optionen.quelle
Siehe Javadoc
out = some stream ... try { } catch ( Exception cause ) { cause . printStrackTrace ( new PrintStream ( out ) ) ; }
quelle
Wenn Sie an einer kompakteren Stapelverfolgung mit weiteren Informationen (Paketdetails) interessiert sind, die wie folgt aussieht:
java.net.SocketTimeoutException:Receive timed out at j.n.PlainDatagramSocketImpl.receive0(Native Method)[na:1.8.0_151] at j.n.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:143)[^] at j.n.DatagramSocket.receive(DatagramSocket.java:812)[^] at o.s.n.SntpClient.requestTime(SntpClient.java:213)[classes/] at o.s.n.SntpClient$1.call(^:145)[^] at ^.call(^:134)[^] at o.s.f.SyncRetryExecutor.call(SyncRetryExecutor.java:124)[^] at o.s.f.RetryPolicy.call(RetryPolicy.java:105)[^] at o.s.f.SyncRetryExecutor.call(SyncRetryExecutor.java:59)[^] at o.s.n.SntpClient.requestTimeHA(SntpClient.java:134)[^] at ^.requestTimeHA(^:122)[^] at o.s.n.SntpClientTest.test2h(SntpClientTest.java:89)[test-classes/] at s.r.NativeMethodAccessorImpl.invoke0(Native Method)[na:1.8.0_151]
Sie können versuchen, Throwables.writeTo aus der spf4j-Bibliothek zu verwenden .
quelle