एक अपवाद का स्टैक ट्रेस प्रिंट करें


81

मैं stderr के अलावा किसी स्ट्रीम के अपवाद का स्टैक ट्रेस कैसे प्रिंट कर सकता हूं? एक तरीका मुझे मिल गया है कि getStackTrace () का उपयोग करें और पूरी सूची को स्ट्रीम में प्रिंट करें।


यदि आप अपवाद ट्रेस प्राप्त करना चाहते हैं, तो स्ट्रिंग के रूप में आप getStackTraceTrowable (अपवाद) की विधि को कॉल StackTraceElementकर सकते हैं, जो उन ऑब्जेक्ट्स की सरणी लौटाएगा जिन्हें आप एक स्ट्रिंग (ट्रेसिंग की एक लाइन प्राप्त करने के लिए उस ऑब्जेक्ट की स्ट्रींग विधि का उपयोग करके) से जोड़ सकते हैं।
जकुबिक

जवाबों:


62

Throwable.printStackTrace(..)PrintWriterया PrintStreamतर्क ले सकते हैं :

} catch (Exception ex) {
    ex.printStackTrace(new java.io.PrintStream(yourOutputStream));
}

उस ने कहा, LogFack या log4j जैसे लॉगिंग कार्यान्वयन के साथ SLF4J जैसे लकड़हारा इंटरफ़ेस का उपयोग करने पर विचार करें ।


77

सुंदर नहीं है, लेकिन फिर भी एक समाधान:

StringWriter writer = new StringWriter();
PrintWriter printWriter = new PrintWriter( writer );
exception.printStackTrace( printWriter );
printWriter.flush();

String stackTrace = writer.toString();

3
यह वही है जिसकी मुझे आवश्यकता थी (भले ही मैं इसका उपयोग करके वास्तव में गंदा महसूस करता हूं!)
हेनले चिउ

77

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 आउट को स्टैक ट्रेस प्रिंट करेगा।


4
@FranklinYu, सवाल का पूरा बिंदु यह है कि वह stderr पर प्रिंट नहीं करना चाहता है, लेकिन एक और मनमानी धारा के लिए।
माइक डेक

9

Android देव न्यूनतावादियों के लिए: Log.getStackTraceString(exception)


1
आप इसे एक मनमाना स्ट्रीम में प्रिंट करने के लिए उपयोग नहीं कर सकते। यह तभी उपयोगी है जब आपके पास एक लकड़हारा कॉन्फ़िगर किया गया हो।
आरवी

मुझे यह न्यूनतम दृष्टिकोण पसंद आया लेकिन इसने मेरे slf4j :(
किलोज

7

अपाचे कॉमन स्टैक ट्रेस को फेंकने योग्य से स्ट्रिंग में बदलने के लिए उपयोगिता प्रदान करता है।

उपयोग:

ExceptionUtils.getStackTrace(e)

पूर्ण प्रलेखन के लिए देखें https://commons.apache.org/proper/commons-lang/javadocs/api-release/index.html


जबकि यह उत्तर बहुत सही लगता है, यह प्रश्न का उत्तर नहीं है। ओपी ने पूछा कि वह स्टैक ट्रेस को किसी अन्य स्ट्रीम में कैसे प्रिंट कर सकता है।
Buurman

भले ही यह ओपी के सवाल का जवाब नहीं दे सकता है, लेकिन मुझे लगता है कि यह एक बहुत अच्छी तरह से स्थापित प्रारूप का उपयोग करते हुए स्ट्रिंग के रूप में एक अपवाद का सबसे अच्छा तरीका है। धन्यवाद!
क्लिंट ईस्टवुड

7

मैंने एक तरीका बनाया है जो स्टैकट्रेस प्राप्त करने में मदद करता है:

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();
}

3

फेंकने योग्य वर्ग नाम के दो तरीके प्रदान printStackTrace, एक है कि एक को स्वीकार करता है PrintWriterऔर एक कि एक में ले जाता है PrintStream, जो दिए गए धारा में स्टैक ट्रेस आउटपुट। इनमें से किसी एक का उपयोग करने पर विचार करें।



0

यदि आप अधिक जानकारी (पैकेज डिटेल) के साथ अधिक कॉम्पैक्ट स्टैक ट्रेस में रुचि रखते हैं, जो इस प्रकार है:

  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 का उपयोग करने का प्रयास कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.