Làm cách nào để in dấu vết ngăn xếp của một ngoại lệ đối với một luồng không phải là stderr? Một cách tôi đã tìm thấy là sử dụng getStackTrace () và in toàn bộ danh sách vào luồng.
Câu trả lời:
Không đẹp, nhưng dù sao cũng là một giải pháp:
StringWriter writer = new StringWriter();
PrintWriter printWriter = new PrintWriter( writer );
exception.printStackTrace( printWriter );
printWriter.flush();
String stackTrace = writer.toString();
Có một dạng thay thế của Throwable.printStackTrace () lấy luồng in làm đối số. http://download.oracle.com/javase/6/docs/api/java/lang/Throwable.html#printStackTrace(java.io.PrintStream)
Ví dụ
catch(Exception e) {
e.printStackTrace(System.out);
}
Thao tác này sẽ in dấu vết ngăn xếp thành std ra thay vì lỗi std.
Đối với những người theo chủ nghĩa tối giản dành cho nhà phát triển Android: Log.getStackTraceString(exception)
Apache commons cung cấp tiện ích để chuyển đổi dấu vết ngăn xếp từ có thể ném thành chuỗi.
Sử dụng:
ExceptionUtils.getStackTrace(e)
Để có tài liệu đầy đủ, hãy tham khảo https://commons.apache.org/proper/commons-lang/javadocs/api-release/index.html
Tôi đã tạo một phương thức giúp lấy stackTrace:
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();
}
Lớp Throwable cung cấp hai phương thức được đặt tên printStackTrace
, một phương thức chấp nhận a PrintWriter
và một phương thức nhận a PrintStream
, xuất ra dấu vết ngăn xếp cho luồng đã cho. Hãy xem xét sử dụng một trong những thứ này.
Nếu bạn quan tâm đến một dấu vết ngăn xếp nhỏ gọn hơn với nhiều thông tin hơn (chi tiết gói) trông giống như:
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]
bạn có thể thử sử dụng Throwables.writeTo từ lib spf4j .
getStackTrace
phương thức Trowable (Ngoại lệ) sẽ trả về mảng cácStackTraceElement
đối tượng mà bạn có thể kết hợp thành một Chuỗi (sử dụng phương thức toString của đối tượng đó để lấy một dòng của dấu vết).