मैं stderr के अलावा किसी स्ट्रीम के अपवाद का स्टैक ट्रेस कैसे प्रिंट कर सकता हूं? एक तरीका मुझे मिल गया है कि getStackTrace () का उपयोग करें और पूरी सूची को स्ट्रीम में प्रिंट करें।
जवाबों:
सुंदर नहीं है, लेकिन फिर भी एक समाधान:
StringWriter writer = new StringWriter();
PrintWriter printWriter = new PrintWriter( writer );
exception.printStackTrace( printWriter );
printWriter.flush();
String stackTrace = writer.toString();
Throwable.printStackTrace () का एक वैकल्पिक रूप है जो एक तर्क के रूप में एक प्रिंट स्ट्रीम लेता है। http://download.oracle.com/javase/6/docs/api/java/lang/Throwable.html#printStackTrace(java.io.PrintStream)
उदाहरण के लिए
catch(Exception e) {
e.printStackTrace(System.out);
}
यह std त्रुटि के बजाय std आउट को स्टैक ट्रेस प्रिंट करेगा।
अपाचे कॉमन स्टैक ट्रेस को फेंकने योग्य से स्ट्रिंग में बदलने के लिए उपयोगिता प्रदान करता है।
उपयोग:
ExceptionUtils.getStackTrace(e)
पूर्ण प्रलेखन के लिए देखें https://commons.apache.org/proper/commons-lang/javadocs/api-release/index.html
मैंने एक तरीका बनाया है जो स्टैकट्रेस प्राप्त करने में मदद करता है:
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();
}
फेंकने योग्य वर्ग नाम के दो तरीके प्रदान printStackTrace, एक है कि एक को स्वीकार करता है PrintWriterऔर एक कि एक में ले जाता है PrintStream, जो दिए गए धारा में स्टैक ट्रेस आउटपुट। इनमें से किसी एक का उपयोग करने पर विचार करें।
यदि आप अधिक जानकारी (पैकेज डिटेल) के साथ अधिक कॉम्पैक्ट स्टैक ट्रेस में रुचि रखते हैं, जो इस प्रकार है:
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]
आप spf4j lib से Throwables.writeTo का उपयोग करने का प्रयास कर सकते हैं ।
getStackTraceTrowable (अपवाद) की विधि को कॉलStackTraceElementकर सकते हैं, जो उन ऑब्जेक्ट्स की सरणी लौटाएगा जिन्हें आप एक स्ट्रिंग (ट्रेसिंग की एक लाइन प्राप्त करने के लिए उस ऑब्जेक्ट की स्ट्रींग विधि का उपयोग करके) से जोड़ सकते हैं।