2011-11-22 9 views
6

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

  • मैं try{...}catch{... throw;} नहीं करना चाहते क्योंकि यह एक अपवाद को पकड़ने के रूप में गिना और उस (कठिन डिबगिंग विकास के दौरान बनाता रहा रोकने के लिए एप्लिकेशन और डीबगर जब मूल अपवाद फेंक दिया है प्रतिक्रिया करने के लिए, और नहीं करना चाहते हैं जब बाहरी अनजान अपवाद है)। दुर्भाग्यवश बहुत सारे झूठे सकारात्मक होने के कारण पहली बार अपवाद हैंडलर कामकाज नहीं कर रहे हैं।
  • मैं सामान्य, असाधारण मामले में अत्यधिक ओवरहेड से बचना चाहता हूं।

क्या अपवाद को पकड़ने के तरीके में अपवाद में संदर्भ के महत्वपूर्ण टुकड़े (जैसे फाइलनाम संसाधित या जो भी हो) को स्टोर करने का कोई तरीका है?

+1

दिलचस्प। क्या आपने 'try {' और '} को पकड़ने का विचार किया है {... फेंक;}' 'if! DEBUG' में। देव में आपको मूल कॉल साइट से मूल अपवाद मिलेगा। –

+0

कोशिश करें {..} पकड़ {.. फेंक;} पैटर्न का उपयोग करने के बारे में, लेकिन सीएलआर अपवाद को फेंकने के दौरान अपने विजुअल स्टूडियो विकल्पों को तोड़ने के लिए बदलें। – Simon

+2

पोस्टशर्प जैसे एओपी के लिए एक अच्छा फिट लगता है, लेकिन यह इसे पकड़ने की आपकी आवश्यकता को पूरा नहीं करता है। यह सिर्फ कोडिंग की मात्रा को हटा देता है जो आपको करने की ज़रूरत है। –

उत्तर

1

मैं एप के एडम के सुझाव के इस इमारत पर एक शॉट ले रहा हूं। मेरी समाधान नहीं बल्कि postsharp से एकता हो सकता है और केवल सवाल मैं होता है कि क्या अपवाद आह्वान के अंदर पकड़ा जा रहा है, जो इस बात की संभावना है ...

 public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) 
    { 
     //execute 
     var methodReturn = getNext().Invoke(input, getNext); 

     //things to do after execution 
     if (methodReturn.Exception != null) 
      methodReturn.Exception.Data.Add("filename", "name of file"); 

     return methodReturn; 
    } 
} 
+0

यह मेरे लिए बिल्कुल स्पष्ट नहीं है कि यह सामान्य कोड का लाभ उठाएगा। इसलिए यदि 'ए' कॉल 'बी' कॉल 'सी' और 'बी' सूचना के साथ' सी' द्वारा किसी भी संभावित अपवाद को एनोटेट करना चाहता है - तो आप इसका उपयोग कैसे करेंगे? –

1

निम्नलिखित पैटर्न के साथ गलत कुछ भी नहीं है:

try 
{ 
    // Do Something 
} 
catch (GeneralException ex) 
{ 
    throw new SpecificException(
     String.Format("More specifics ({0}) in message", someData), 
     moreContext, 
     new {even, more, context}, 
     ex); 
} 

उदाहरण के लिए, उदाहरण के लिए, "कुछ करना" कहने के लिए यह पैटर्न है, कहें, किसी प्रकार की फाइल खोलें। "विशिष्ट अपवाद" हो सकता है "विन्यास फाइल नहीं पढ़ सकता"।

+0

यहां समस्या दो गुना है: सबसे पहले, यह आमतौर पर केवल अव्यवस्था है, और मैं इसे व्यवस्थित रूप से करना चाहता हूं। नेस्टेड में नेस्टेड में नेस्टेड में घिरा हुआ [...] अपवाद एक साधारण फ्लैट दृष्टिकोण पर मदद नहीं कर रहे हैं; इस बात का जिक्र नहीं है कि असर फेंकने की लागत अंततः रैखिक के विपरीत इस तरह से स्टैक्डपथ के साथ चतुर्भुज हो सकती है। दूसरा, और अधिक तुरंत परेशान, यह अपवाद को पकड़ने का कारण बनता है जो प्रश्न में वर्णित डीबगिंग को जटिल बनाता है। –

+0

हालांकि दूसरे पर; यह बहुत ही असंभव है कि परिणामस्वरूप समय-जटिलता होगी (हालांकि आपको सुनिश्चित करने के लिए सीएलआर आंतरिक पता होना चाहिए)। हालांकि, यह अव्यवस्था + डिबगैबिलिटी मुद्दों को हल करता है। –

+0

संयोग से, मैं मूल रूप से यही करता हूं; यह काम करता है, लेकिन मैं कुछ बेहतर ढूंढ रहा हूं :-) –

0

मैं अपवादों को पकड़ने के लिए एओपी का उपयोग नहीं करता। इसके बजाय मैं अपवाद को फेंकने के तरीके के सभी अपवादों को अपवाद को खोने के लिए अवरोध वर्ग का उपयोग करूंगा। और उसके बाद मूल अपवाद को फिर से फेंक दिया जाए

+0

-1: बुरा विचार। यदि अपवाद प्रचार नहीं करता है, तो आप पूरे कॉल स्टैक को कैप्चर नहीं करते हैं। ओपी अनुरोध के रूप में, कॉल साइट के पास अतिरिक्त जानकारी जोड़कर, शीर्ष पर अपवाद लॉग करें। –

+0

यह एक बुरा विचार क्यों है? कुछ अवरोध ढांचे सिर्फ 'फेंक'; कॉल स्टैक आरक्षित है – jgauffin

+0

"आरक्षित" = "संरक्षित" – jgauffin

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