मैं जावा स्टैक ट्रेस डंप की प्रदर्शित लाइनों की संख्या कैसे बढ़ाऊं?


जवाबों:


122

आप की जरूरत नहीं है; यह जानकारी स्टैक ट्रेस में कहीं और मौजूद है। के डॉक्स से printStackTrace():

वर्णों की पंक्तियों की उपस्थिति पर ध्यान दें "..."। इन पंक्तियों से संकेत मिलता है कि इस अपवाद के लिए स्टैक ट्रेस का शेष उस अपवाद के स्टैक ट्रेस के नीचे से फ़्रेम की इंगित संख्या से मेल खाता है जो इस अपवाद के कारण हुआ था ("एनक्लोजिंग" अपवाद)।

यह आशुलिपि आम मामले में आउटपुट की लंबाई को काफी कम कर सकती है जहां एक लिपटे हुए अपवाद को उसी विधि से फेंका जाता है जब "करणीय अपवाद" पकड़ा जाता है।

दूसरे शब्दों में, "... x more"केवल एक जंजीर अपवाद पर दिखाई देता है, और केवल जब xस्टैक ट्रेस की अंतिम लाइनें पहले से ही एक और जंजीर अपवाद के स्टैक ट्रेस के भाग के रूप में मौजूद होती हैं।

मान लीजिए कि एक विधि अपवाद फू को पकड़ती है, इसे अपवाद बार में लपेटता है, और बार फेंकता है। फिर फू के स्टैक ट्रेस को छोटा किया जाएगा। यदि आप किसी कारण से पूर्ण ट्रेस चाहते हैं, तो आपको केवल ...फू की स्टैक ट्रेस से पहले अंतिम पंक्ति लेनी होगी और इसे बार के स्टैक ट्रेस में देखना होगा; उस लाइन के नीचे सबकुछ वही है जो फू के स्टैक ट्रेस में छपा होगा।


अंतिम पैराग्राफ भ्रामक है। कोई ओवरलैप नहीं होगा, इससे पहले ...की रेखा पहला फ्रेम है जो अलग है। हालाँकि यह कम से कम उसी वर्ग में होगा जो इसे खोजने में मदद करता है।
Marcono1234

5

आपके लिए एक विधि पर त्वरित अनुमान।

static void printLongerTrace(Throwable t){
    for(StackTraceElement e: t.getStackTrace())
        System.out.println(e);
}

2

आइए Throwable.printStackTrace () के प्रलेखन से स्टैक ट्रेस लें :

HighLevelException: MidLevelException: LowLevelException
    at Junk.a(Junk.java:13)
    at Junk.main(Junk.java:4)
Caused by: MidLevelException: LowLevelException
    at Junk.c(Junk.java:23)
    at Junk.b(Junk.java:17)
    at Junk.a(Junk.java:11)
    ... 1 more
Caused by: LowLevelException
    at Junk.e(Junk.java:30)
    at Junk.d(Junk.java:27)
    at Junk.c(Junk.java:21)
    ... 3 more

कारण सबसे नेस्टेड एक से नीचे ("मूल कारण") में प्रदर्शित होते हैं, एक मुद्रित प्रिंट ट्रेस का होता है।

इस मामले में मूल कारण है LowLevelException, जो कारण है MidLevelException, जो कारण बना HighLevelException

पूर्ण स्टैक ट्रेस प्राप्त करने के लिए आपको एन्क्लोज़िंग अपवाद (और इसके एनक्लोज़िंग अपवाद) के फ़्रेम को देखना होगा:

  1. देखो कि कितने फ्रेम छोड़े गए थे: "... X और"
  2. संलग्नक अपवाद पर छोड़े गए फ़्रेमों को देखें
    1. देखो कि कितने फ्रेम छोड़े गए थे: "... Y और"
    2. स्टैक ट्रेस पर पहले X - Y फ़्रेम को जोड़ें
  3. यदि Y> 0 है, तो चरण 2 को इसके साथ दोहराए गए फ़्रेम की संख्या के रूप में दोहराएं

इसलिए यदि हम पूर्ण स्टैक ट्रेस प्राप्त करना चाहते हैं तो हम LowLevelExceptionनिम्नलिखित कार्य करेंगे:

  1. देखो कि कितने फ्रेम को छोड़ा गया था: "... 3 और"
  2. संलग्नक अपवाद पर छोड़े गए फ़्रेम को देखें ( MidLevelException)
    1. 1 फ्रेम छोड़ा गया है ("... 1 और")
    2. स्टैक ट्रेस करने के लिए पहले 2 (3 - 1) फ़्रेम को जोड़ें
  3. छोड़े गए फ़्रेमों की संख्या के साथ चरण 2 को 1 दोहराएं
    1. MidLevelException( HighLevelException) के एनक्लोजिंग अपवाद को देखें
    2. स्टैक ट्रेस पर पहले 1 फ़्रेम को जोड़ें

आपका पूरा स्टैक ट्रेस इस तरह दिखता है:

LowLevelException
    at Junk.e(Junk.java:30)
    at Junk.d(Junk.java:27)
    at Junk.c(Junk.java:21)
    // From MidLevelException stack trace
    at Junk.b(Junk.java:17)
    at Junk.a(Junk.java:11)
    // From HighLevelException stack trace
    at Junk.main(Junk.java:4)

साइड नोट्स:

  • ऐसे मामले हो सकते हैं जहां कोई फ़्रेम सूचीबद्ध नहीं है, उदाहरण के लिए:

    HighLevelException: MidLevelException
        at Junk.main(Junk.java:4)
    Caused by: MidLevelException
        ... 1 more

    यह तब हो सकता है जब कारण एक ही पंक्ति में बनाया गया हो new HighLevelException(new MidLevelException()):। इससे भ्रमित न हों, ऊपर वर्णित दृष्टिकोण अभी भी काम करता है, अपवाद से उपयोग करने के लिए बस कोई फ्रेम नहीं हैं, इसके संलग्न के साथ जारी रखें।

  • कुछ मामलों में आप पहली फ्रेम को देखकर खुद को गिन सकते हैं, जिसे छोड़ा नहीं गया था (ऊपर की रेखा ... X more)। यदि आप जानते हैं कि कौन सी विधियाँ उस पंक्ति में विधि कहती हैं, तो आप सीधे कॉलर्स के लिए एन्क्लोज़िंग अपवाद के फ़्रेम में खोज सकते हैं:

    HighLevelException: MidLevelException: LowLevelException
        at Junk.c(Junk.java:29)
        at Junk.b(Junk.java:21)
        at Junk.a(Junk.java:13)
        at Junk.main(Junk.java:4)
    Caused by: MidLevelException
        // You know Junk.d is only called by Junk.b
        at Junk.d(Junk.java:35)
        ... 3 more
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.