2008-09-07 16 views
11

पर अतिरिक्त जानकारी जोड़ना मैंने एक बहुत ही विशिष्ट समस्या के लिए एक कस्टम अपवाद बनाया है जो गलत हो सकता है। मुझे किसी अन्य सिस्टम से डेटा प्राप्त होता है, और अगर मैं उस डेटा को पार्स करने का प्रयास करते समय बम करता हूं तो अपवाद बढ़ाता हूं। मेरे कस्टम अपवाद में, मैंने "ResponseData" नामक एक फ़ील्ड जोड़ा, इसलिए मैं ट्रैक कर सकता हूं कि मेरा कोड वास्तव में क्या संभाल नहीं सकता था।कस्टम अपवाद

इस तरह के कस्टम अपवादों में, क्या अतिरिक्त प्रतिक्रिया डेटा अपवाद "संदेश" में जाना चाहिए? अगर यह वहां जाता है, तो संदेश बहुत बड़ा हो सकता है। मैं इसे वहां चाहता हूं क्योंकि मैं एल्मा का उपयोग कर रहा हूं, और इस तरह मैं उस डेटा पर जा सकता हूं। अतिरिक्त अपवाद विवरण "संदेश" संपत्ति में जाने चाहिए - - मैं Elmah एक कस्टम अपवाद या में एक क्षेत्र से अतिरिक्त जानकारी रिकॉर्ड करने के लिए कैसे प्राप्त कर सकते हैं:

तो सवाल यह या तो है?

उत्तर

6

आपको डीबग जानकारी के साथ .Message भरना नहीं चाहिए, बल्कि टेक्स्ट के एक संक्षिप्त, उपयोगी टुकड़े के साथ।

http://msdn.microsoft.com/en-us/library/system.exception.message.aspx

संदेश का पाठ पूरी तरह से त्रुटि का वर्णन करना चाहिए और चाहिए, जब संभव हो, यह कैसे सही करने के लिए समझाने की। संदेश संपत्ति का मूल्य ToString द्वारा लौटाई गई जानकारी में शामिल है।

संदेश संपत्ति केवल अपवाद बनाते समय सेट की जाती है। कोई संदेश वर्तमान उदाहरण के लिए निर्माता के लिए आपूर्ति की गई थी, तो प्रणाली है कि वर्तमान प्रणाली संस्कृति का उपयोग कर स्वरूप में डिफ़ॉल्ट संदेश आपूर्ति करती है।

[..]

उत्तराधिकारियों के लिए नोट्स:

संदेश संपत्ति वर्गों कि संदेश सामग्री या प्रारूप पर नियंत्रण की आवश्यकता होती है में ओवरराइड की गई है। एप्लिकेशन कोड आम तौर पर इस संपत्ति तक पहुंचता है जब इसे पकड़े गए अपवाद के बारे में जानकारी प्रदर्शित करने की आवश्यकता होती है।

त्रुटि संदेश को स्थानीयकृत किया जाना चाहिए।

रिस्पांस डेटा एक विवरण के रूप में योग्य नहीं है।

नहीं elmah से परिचित होने के नाते, मैं आपको नहीं बता सकते हैं कि कैसे है, जबकि इसे प्रयोग Exception वर्ग का विस्तार करने के। क्या elmah Exception पर अपने उप-वर्ग लागू करता है? या एक इंटरफ़ेस? आप इसे अपने आप को उपवर्ग कर सकते हैं?

0

मुझे सवाल नहीं समझा है - आप सिस्टम का विस्तार कर रहे हैं। अपवाद, और आप पहले से ही एल्माह क्षेत्र जोड़ चुके हैं। यही वह जगह है जहां यह अपवाद की सार्वजनिक संपत्ति के रूप में है।

1

मैं पूरी तरह से सवाल समझ में नहीं आता है, लेकिन आप क्या अतिरिक्त अपवाद डेटा के साथ क्या करना है, अगर है कि आपके सवाल यह की अनदेखी करने के लिए स्वतंत्र महसूस नहीं है पूछ रहे हैं।

मुझे लगता है कि पूछने का एक महत्वपूर्ण सवाल यह है कि अपवाद संदेश वास्तव में क्या है? यह जानने के लिए नहीं है कि अपवाद कहां से आया था, इसके लिए स्टैक ट्रेस है; यह एक सामान्य सामान्य में अपवाद को समाहित नहीं करना है, जो इनरएक्सप्शन फ़ील्ड के साथ किया जाना चाहिए; ऐसे मामले में जहां आपका अपवाद केवल आपके कोड में किसी विशेष स्थान से उठाया गया है, यह वर्णन करने के लिए भी नहीं है कि आपके पास किस तरह की त्रुटि है - यह कि किस प्रकार का अपवाद है।

आम तौर पर मैं सरल, मानव-पठनीय युक्तियाँ प्रदान करने के लिए संदेश फ़ील्ड का उपयोग करता हूं जो एक प्रोग्रामर जो मुझे नहीं है, पहली बार यह त्रुटि अंतर्निहित प्रणाली की समझ प्राप्त करने के लिए उपयोग कर सकती है। मैं संदेश फ़ील्ड को एक संक्षिप्त (एक वाक्य) स्पष्टीकरण के लिए उचित मानता हूं, यह संकेत कि इस त्रुटि को अक्सर कैसे उठाया जाता है, या आगे पढ़ने के संदर्भ में।

तो, जहां तक ​​मैं आपका प्रश्न समझता हूं, मुझे लगता है कि किसी अन्य सिस्टम से प्राप्त 'अतिरिक्त जानकारी' को स्टोर करने का सबसे अच्छा तरीका एक इंजेक्शन अपवाद के रूप में है। मुझे एल्मा नहीं पता, लेकिन अगर यह इसके नमक के लायक है तो यह इनर एक्सेप्शन की जांच करेगा और उन्हें स्टोर करेगा।

0

एल्मा एक http मॉड्यूल है जो अनचाहे अपवाद रिकॉर्ड करता है।

मुझे लगता है कि यह एल्मा की एक सीमा है, क्योंकि यह कस्टम फ़ील्ड स्टोर नहीं करता है। मुझे लगता है मुझे उन लोगों से पूछना होगा। प्रतिक्रिया डेटा के लिए मेरे पास अतिरिक्त क्षेत्र है, लेकिन एल्मा इसे स्टोर नहीं करता है।

11

कस्टम अपवाद में इसी प्रकार के, कि अतिरिक्त प्रतिक्रिया डेटा अपवाद "संदेश" में जाना चाहिए?

नहीं, Sören already pointed out के रूप में। हालांकि, आपका अपवाद प्रकार ToString ओवरराइड कर सकता है और समझदारी से प्रतिक्रिया डेटा जानकारी जोड़ सकता है। यह एक पूरी तरह से सामान्य अभ्यास है जिसके बाद बीसीएल (बेस क्लास लाइब्रेरी) में कई अपवाद प्रकार हैं, इसलिए आप अपने आप को ज्वार के खिलाफ तैरने नहीं पाएंगे।

public override String ToString() 
{ 
    String s = GetType().FullName + ": " + Message; 

    if (_fileName != null && _fileName.Length != 0) 
     s += Environment.NewLine + String.Format(Environment.GetResourceString("IO.FileName_Name"), _fileName); 

    if (InnerException != null) 
     s = s + " ---> " + InnerException.ToString(); 

    if (StackTrace != null) 
     s += Environment.NewLine + StackTrace; 

    try 
    { 
     if(FusionLog!=null) 
     { 
      if (s==null) 
       s=" "; 
      s+=Environment.NewLine; 
      s+=Environment.NewLine; 
      s+="Fusion log follows: "; 
      s+=Environment.NewLine; 
      s+=FusionLog; 
     } 
    } 
    catch(SecurityException) 
    { 

    } 
    return s; 
} 

आप देख सकते हैं, यह FusionLog संपत्ति है, जो विधानसभा लोड विफलताओं की स्थिति में अतिरिक्त जानकारी प्रतिनिधित्व की सामग्री के संलग्न कर देता है: उदाहरण के लिए, SSCLI (Rotor) में System.IO.FileNotFoundException.ToString कार्यान्वयन पर एक नजर है।

मैं कैसे एक क्षेत्र से अतिरिक्त जानकारी एक कस्टम में अपवाद

ELMAH भंडार त्रुटि के विवरण के रूप में एक अपवाद पर ToString बुला का परिणाम रिकॉर्ड करने के लिए Elmah प्राप्त कर सकते हैं, इसलिए यदि आप है ToString निर्धारित के रूप में लागू किया गया है, जानकारी बिना किसी काम के लॉग इन होगी। एकमात्र मुद्दा यह है कि लॉग विवरण असंगठित टेक्स्ट होगा।

4

अपवाद वर्ग में एक शब्दकोश (नामित डेटा, मेरा मानना ​​है) है जिसका उपयोग आप कस्टम डेटा को वेनिला अपवाद के साथ जोड़ने के लिए कर सकते हैं।

+0

http://msdn.microsoft.com/en-us/library/system.exception.data(v=vs.110).aspx –

+0

याद रखें कि कोई अपवाद क्रमबद्ध है, इसके अंदर सबकुछ भी क्रमिक करने योग्य होना चाहिए - इसलिए यदि आपका ऑब्जेक्ट जटिल है तो आपको केवल वही निकालना अच्छा होगा –

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