अपवाद में पूर्ण स्टैक ट्रेस कैसे प्रिंट करें?


97

उदाहरण के लिए, एक ही स्थान पर ...

//---------------a
try
{
    // some network call
}
catch(WebException we)
{
    throw new MyCustomException("some message ....", we);
}

... और दूसरी जगह ...

//--------------b
try
{
    // invoke code above
}
catch(MyCustomException we)
{
    Debug.Writeline(we.stacktrace);   // <----------------
}

मैं जिस स्टैट्रेस को प्रिंट करता हूं, यह केवल एक बी से शुरू होता है, इसमें वेबएक्सटैप्शन से आंतरिक स्टैकट्रेस शामिल नहीं है।

मैं सभी स्टैकट्रेस कैसे प्रिंट कर सकता हूं ???


1
ध्यान दें कि WebException की उत्पत्ति के लिए स्टैकट्रेस मुद्रित नहीं किया जाएगा क्योंकि आपने WebException को फिर से फेंकने के बजाय एक नया अपवाद फेंक दिया था। यदि आप मूल अपवाद स्टैक को संरक्षित (और आउटपुट) करना चाहते हैं throw;, throw new MyCustomException(...)तो इसके बदले में उपयोग करें ।
बील

जवाबों:


174

मैं आमतौर पर पाठ में पूर्ण अपवाद जानकारी (इनर स्टैक ट्रेस सहित) प्रस्तुत करने के लिए अपवादों पर .TString () पद्धति का उपयोग करता हूं:

catch (MyCustomException ex)
{
    Debug.WriteLine(ex.ToString());
}

नमूना उत्पादन:

ConsoleApplication1.MyCustomException: some message .... ---> System.Exception: Oh noes!
   at ConsoleApplication1.SomeObject.OtherMethod() in C:\ConsoleApplication1\SomeObject.cs:line 24
   at ConsoleApplication1.SomeObject..ctor() in C:\ConsoleApplication1\SomeObject.cs:line 14
   --- End of inner exception stack trace ---
   at ConsoleApplication1.SomeObject..ctor() in C:\ConsoleApplication1\SomeObject.cs:line 18
   at ConsoleApplication1.Program.DoSomething() in C:\ConsoleApplication1\Program.cs:line 23
   at ConsoleApplication1.Program.Main(String[] args) in C:\ConsoleApplication1\Program.cs:line 13

बहुत अच्छा। मैं इसे करने के लिए एक सरल तरीके की तलाश कर रहा था और यहां यह है। कुछ छोटी चिंता यह नहीं है कि आप अपवाद का उपयोग करें। उदाहरण के लिए। मुझे आश्चर्य है कि क्या ऐसा करने का अधिक स्पष्ट तरीका है?
कोडिया

4
ध्यान रखें कि कुछ लाइब्रेरी ToStringपूरी जानकारी के बजाय विधि को ओवरराइड करती हैं और कस्टम संदेश प्रिंट करती हैं (यह एक खराब कोडिंग अभ्यास है, इसलिए ऐसा कभी करें)
Dinei

@P over் मैं उपयोग करता हूं ToStringजब भी मुझे यकीन है कि यह ओवरराइट नहीं किया गया है, और सीधे गुणों का उपयोग करें अन्यथा (जैसे एंड्रयू हरे का जवाब )।
दीनी

53

इस तरह एक समारोह का उपयोग करें:

    public static string FlattenException(Exception exception)
    {
        var stringBuilder = new StringBuilder();

        while (exception != null)
        {
            stringBuilder.AppendLine(exception.Message);
            stringBuilder.AppendLine(exception.StackTrace);

            exception = exception.InnerException;
        }

        return stringBuilder.ToString();
    }

तो आप इसे इस तरह से कॉल कर सकते हैं:

try
{
    // invoke code above
}
catch(MyCustomException we)
{
    Debug.Writeline(FlattenException(we));
}

13
या आप उपयोग कर सकते हैं ToString?
जस्टिन

मैं ToString का उपयोग कर रहा हूं और लगता है कि यह ठीक है। मैं एंड्रयू के समाधान के साथ जाऊंगा अगर मैं केवल सबसे कम आंतरिक अपवाद चाहता हूं (वास्तविक कारण के साथ) या इसी तरह की पिकिंग .. हालांकि दोनों काम करता है :)
EeKay

यह अधिक लचीला है कि सिर्फ ToString, क्योंकि आप चुन सकते हैं कि उस स्ट्रिंग में क्या जाता है। शायद मुझे केवल स्टैक के निशान में दिलचस्पी है, जरूरी नहीं कि संदेश। या मैं इसे एक सूची <string> नहीं एक स्ट्रिंग के रूप में चाहता हूं।
ज़ार शारदान

18

1. विधि बनाएँ: यदि आप निम्न फ़ंक्शन के लिए अपना अपवाद पास करते हैं, तो यह आपको सभी तरीके और विवरण देगा जो अपवाद के कारण हैं।

public string GetAllFootprints(Exception x)
{
        var st = new StackTrace(x, true);
        var frames = st.GetFrames();
        var traceString = new StringBuilder();

        foreach (var frame in frames)
        {
            if (frame.GetFileLineNumber() < 1)
                continue;

            traceString.Append("File: " + frame.GetFileName());
            traceString.Append(", Method:" + frame.GetMethod().Name);
            traceString.Append(", LineNumber: " + frame.GetFileLineNumber());
            traceString.Append("  -->  ");
        }

        return traceString.ToString();
}

2. कॉल विधि: आप इस तरह से विधि को कॉल कर सकते हैं।

try
{
    // code part which you want to catch exception on it
}
catch(Exception ex)
{
    Debug.Writeline(GetAllFootprints(ex));
}

3. परिणाम प्राप्त करें:

File: c:\MyProject\Program.cs, Method:MyFunction, LineNumber: 29  -->  
File: c:\MyProject\Program.cs, Method:Main, LineNumber: 16  --> 

1
काफी मददगार। मैंने आपके उदाहरण के आधार पर एक विस्तार विधि बनाई है । BTW, बड़ी संख्या में पुनरावृत्तियों के मामले में आप बेहतर StringBuilderकक्षा का उपयोग करेंगे ।
एलेक्समेलव

2
आंद्रेसी लिंक मर चुका था। यह उनके कार्यान्वयन की वर्तमान कड़ी है: github.com/AndreyWD/EasySharp/blob/master/NHelpers/…
ईसाई जोड़

जो प्रोफेशनल एंड्री दिखता है। मैंने अपनी लाइब्रेरी को अपने टूलबॉक्स में डाल दिया। धन्यवाद। @AndreyWD
Oguzhan KIRCALI
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.