2011-09-06 16 views
6

मैं अपवाद फेंकना चाहता हूं लेकिन कस्टम संदेश के साथ और स्टैकट्रैस भी जारी रखना चाहता हूं। मैं विभिन्न धागे से गुजर चुका हूं।अपवाद फेंक दें लेकिन स्टैक ट्रेस जारी रखें

**The remote server returned an error: (401) Unauthorized.** 

[WebException: The remote server returned an error: (401) Unauthorized.] 
original stack trace 

[NewException: newMessage] 
New Stack Trace 

अच्छी बात सब कुछ स्क्रीन पर देखते है:

catch (Exception ex) 
{ 
throw; // Message is read only but stacktrace persist 
throw ex; // Message is readonly and strack trace also blows .. worst! 
throw new CustomException("My exception");// Message can be overridden but stacktrace lost 
throw new CustomException("My message",ex);// same as above. However if this constructor in exception class calls same constructor of base class then .. see below 
} 

जब पिछले appraoch मौत की स्क्रीन पर, उत्पादन (कस्टम अपवाद निर्माता आधार वर्ग निर्माता बुला के साथ) प्रयोग किया जाता है कुछ की तरह है। लेकिन, शीर्ष पर मैं अपना अपवाद प्रदर्शित करना चाहता हूं यानी "नया संदेश" और मूल संदेश नहीं।

इसलिए मेरे प्रश्न को सुलझाने: मैं मौत की स्क्रीन पर मूल स्टैक ट्रेस कैसे दिखा सकता हूं लेकिन एक कस्टम त्रुटि संदेश के साथ?

+1

इस अपवाद लौटने एक वेब सेवा है? – Oded

+0

मेरे उदाहरण में यह वास्तव में एक webservice कॉल है। हालांकि यह अपरिपक्व है क्योंकि अपवाद डिवीजनबिज़ेरो या एसक्यूएलएक्सप्शन इत्यादि जैसे कुछ भी हो सकता था। आइडिया उपयोगकर्ता को मूल स्टैक ट्रेस के बारे में जानकारी देना है, लेकिन डेवलपर डिफ़ॉल्ट अपवाद संदेश को और अधिक मदद करने के लिए भी अनुकूलित करता है। – helloworld

+0

नहीं, यह असंभव नहीं है। वेबसाइट सेवा ढांचे के अपवादों के बारे में अपने विचार हैं। –

उत्तर

8
throw new CustomException("My message",ex);// same as above (... stacktrace lost) 

टिप्पणियों में आपका निष्कर्ष अंतिम पर गलत है। स्टैकट्रैक आंतरिक अपवाद में रखा जाता है। मानक रिपोर्टिंग (Exception.ToString() सहित) पूर्ण स्टैकट्र्रेस की रिपोर्ट करेगा। जब आप कन्स्ट्रक्टर को सही पाते हैं तो यह वही है जो आप देख रहे हैं। (हमेशा सही बेस ctor कॉल करें!)।

लेकिन मुझे [WebException] पहचान नहीं है। डब्ल्यूसीएफ में आपको

<serviceDebug includeExceptionDetailInFaults="true"/> 

मुझे लगता है कि आपके वेब वातावरण में ग्राहक की ओर त्रुटि रिपोर्ट को दबाने की एक समान सुविधा है।

3

अपने चौथे दृष्टिकोण का उपयोग करना यह आम तौर पर किया जाता है और स्थापित पैटर्न कैसे किया जाता है। आपको अपवाद हैंडलिंग (या बढ़ाना) को इस तरह से भ्रमित नहीं करना चाहिए कि वे कैसे प्रदर्शित होते हैं या लॉग किए जाते हैं, या जो भी हो।

यदि आपके पास नियंत्रण में पकड़े गए (पकड़े गए) अपवाद का आउटपुट है, यानी संबंधित कोड बदल/लिख सकते हैं, तो आप बस Exception.ToString() विधि का उपयोग कर सकते हैं, जो बाहरी अपवाद मुद्रित करेगा, जिसमें सभी "आंतरिक" शामिल हैं।

टिप्पणी: कभी-कभी आंतरिक अपवाद किसी एप्लिकेशन द्वारा उद्देश्य पर प्रदर्शित नहीं होते हैं। उदाहरण के लिए डब्ल्यूसीएफ (विंडोज कम्युनिकेशन फाउंडेशन) में आंतरिक अपवाद सर्वर से क्लाइंट तक स्थानांतरित नहीं किया जाता है जब तक कि IncludeExceptionDetails (कॉन्फ़िगरेशन, कोड, ... के माध्यम से) सेट किया गया हो। यह आमतौर पर किया जाता है क्योंकि आंतरिक अपवाद को कार्यान्वयन विवरण माना जाता है, जो आपके आवेदन को तोड़ने के लिए मूल्यवान जानकारी के साथ हमलावर प्रदान कर सकता है।

0

स्टैकट्रेस संपत्ति को ओवरराइड करने के बारे में क्या?

class CustomException : Exception { 

    public CustomException(string message, Exception inner) : base(message, inner) { 
    } 

    public override string StackTrace { 
     get { 
      if (InnerException != null) { 
       return InnerException.StackTrace; 
      } 
      return base.StackTrace; 
     } 
    } 
} 
+0

धन्यवाद! कोशिश की ... मौत की पीली स्क्रीन प्रदर्शित होने पर, इनरएक्सप्शन की वापसी पर ब्रेकपोइंग। स्टैकट्रैक को तीन बार बुलाया गया था और हर बार यह मूल स्टैकट्रस दिखाता था। लेकिन अजीब बात यह है कि यह अभी भी नया स्टैक ट्रेस प्रदर्शित करता है :( – helloworld

+0

@enableDeepak: यह नहीं पता था कि यह ब्रह्मांड को खुद पर गिरने का कारण बन जाएगा ... क्षमा करें :( –

0

मैं मानता हूँ, विकल्प 4 आमतौर पर सबसे अच्छा है ...

हालांकि, विकास के दौरान, मैं इसे बहुत पूरे पकड़ खंड एक #if अंदर एक अंत के साथ, (! डीबग) डाल करने के लिए उपयोगी पाते हैं यह बाहर (डीबग मोड में संकलन की अनुमति देने के लिए):

#if (!DEBUG) 
catch (Exception ex) 
{ 
    // Catch logic for Release mode 
} 
#endif 
finally { } 

यह बिंदु जहां त्रुटि हुई थी पर एपीआई तोड़ बनाता बजाय शीर्ष स्तर पर की।

बस #if की आदत न बनाएं ...लगभग सभी अन्य मामलों में, एक विधि के सामने का उपयोग

[Conditional("DEBUG")] 

बजाय

संबंधित मुद्दे