2010-04-29 13 views
10

मैं डिबगिंग करते समय अपवादों को तोड़ने में सक्षम होना चाहता हूं ... जैसे विजुअल स्टूडियो 2008 के मेनू डीबग/अपवाद संवाद में, मेरे प्रोग्राम को छोड़कर मुझे कुछ अलग अपवाद हैं जो मैं डीबग करना चाहता हूं।क्या मैं प्रोग्रामेटिक रूप से अपवादों को तोड़ने/अक्षम कर सकता हूं?

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

+0

मुझे नहीं लगता कि आप कर सकते हैं, लेकिन मुझे यकीन है कि के लिए पता नहीं है। –

+1

आपके प्रोग्राम में कई मान्य अपवाद हैं? इसका क्या मतलब है? –

+1

इसका मतलब है कि मैं पुस्तकालयों का उपयोग कर रहा हूं जो कोड में पिछली स्थितियों की रिपोर्ट करने के लिए अपवादों का उपयोग करते हैं। वे चेतावनियां हैं और घातक नहीं हैं और वहां एपीआई का हिस्सा हैं, इसलिए मैं उन्हें रोक नहीं सकता और उन्हें उचित रूप से पकड़ना और कोड को पकड़ना है। – AnthonyLambert

उत्तर

6

इस विधि के करीब कुछ करने का एकमात्र तरीका है आपकी विधि पर DebuggerNonUserCodeAttribute डालना।

यह सुनिश्चित करेगा कि चिह्नित विधि में कोई अपवाद अपवाद पर ब्रेक नहीं देगा।

यह here का अच्छा स्पष्टीकरण ...

यह एक विशेषता है कि आप एक विधि के खिलाफ डाल डिबगर बताने के लिए है "मेरे साथ क्या करना GUV 'कुछ भी नहीं। मेरी कोड नहीं है!"। बेवकूफ डीबगर आपको विश्वास करेगा, और उस विधि में नहीं टूट जाएगा: विशेषता का उपयोग करके डीबगर विधि को पूरी तरह से छोड़ देता है, भले ही आप कोड के माध्यम से कदम उठा रहे हों; अपवाद जो होते हैं, और फिर विधि के भीतर पकड़े जाते हैं, वे डीबगर में नहीं टूट जाएंगे।यह इस तरह से व्यवहार करेगा जैसे कि यह फ्रेमवर्क असेंबली के लिए एक कॉल था, और एक अपवाद को अनचाहे जाना चाहिए, इस विधि को कॉल करने वाले कोड में कॉल स्टेक के एक स्तर की सूचना दी जाएगी।

कोड उदाहरण:

public class Foo 
{ 
    [DebuggerNonUserCode] 
    public void MethodThatThrowsException() 
    { 
     ... 
    { 
} 
1

#if डीबग में अपनी कोशिश पकड़ ब्लॉक लपेटें

public void Foo() 
    { 
     #if DEBUG 
     try 
     #endif 
     { 
      //Code goes here 
     } 
     #if DEBUG 
     catch (Exception e) 
     { 
      //Execption code here 
     } 
     #endif 
    } 

मैं के बाहर घुंघराले ब्रेसिज़ रखना चाहते कि जिस तरह से #if यह एक ही दायरे में कोड होता रहता है तो अंदर या डिबग के बाहर।

आप अभी भी execption handeling चाहते हैं, लेकिन और अधिक विस्तार चाहते हैं तो आप इस

 try 
     { 
      //code 
     } 
     catch (FileNotFoundException e) 
     { 
      //Normal Code here 
      #if DEBUG 
      //More Detail here 
      #endif 
     } 
     #if DEBUG 
     catch (Exception e) 
     { 
      //handel other exceptions here 
     } 
     #endif 
+0

कुछ का उपयोग कर इस तरह एक छोटे से क्लीनर दिखता है: [सशर्त ("डीबग")] निजी शून्य MyMethod() { ... } –

+0

मेरी समस्या नहीं कोशिश पकड़ के साथ है, लेकिन फेंक पर डिबग में तोड़कर। ... – AnthonyLambert

2

conditional breakpoints के बारे में क्या कर सकता है? अगर मैं सही ढंग से समझता हूं, तो आप केवल ब्रेकपॉइंट आग ले सकते हैं जब किसी निश्चित चर या अभिव्यक्ति का मान सत्य होता है।

1

यह आपके लिए बहुत देर हो चुकी है, लेकिन यह सबसे बड़ा कारण है कि मैं अक्सर लोगों को रूढ़िवादी रूप से अपवादों का उपयोग करने के लिए सिखाने की कोशिश करता हूं। केवल कुछ अपमानजनक होने पर अपवादों का उपयोग करें और उचित रूप से जारी रखने की आपकी क्षमता समाप्त हो गई है।

किसी प्रोग्राम को डीबग करते समय मैं अक्सर एप्लिकेशन को डीबग करने के लिए प्रथम मौका अपवाद (डीबग -> अपवाद) पर फ़्लिप करता हूं। यदि बहुत सारे अपवाद हैं तो यह पता लगाना बहुत मुश्किल है कि कुछ "गलत" कहां गया है।

इसके अलावा, यह कुख्यात "पकड़ फेंक" जैसे कुछ विरोधी पैटर्न की ओर जाता है और वास्तविक समस्याओं को रोक देता है। उस पर अधिक जानकारी के लिए मैंने इस विषय पर blog post देखा है।

आपकी समस्या के संदर्भ में, आप केवल एक विशिष्ट प्रकार के अपवाद के लिए पहली मौका डीबगिंग चालू कर सकते हैं। यह तब तक अच्छा काम करना चाहिए जब तक कि अन्य अपवाद एक ही प्रकार के न हों।

+0

मैं आपको चेतावनी अपवादों और फ़ंक्शन द्वारा समूहित घातक अपवादों को लागू करने की अनुशंसा करता हूं, आप केवल उन लोगों को चालू/बंद कर सकते हैं जिन्हें आप जाल करना चाहते हैं। मुझे लगता है कि विचार अपवादों का उपयोग नहीं किया जाना चाहिए बस सही ढंग से इस्तेमाल किया! मेरी समस्या यह है कि मैंने अपवाद उत्पन्न करने वाले सभी कोड नहीं लिखे हैं और वे हर जगह सामान्य अपवादों का उपयोग करते हैं, इसलिए इसे अलग करना मुश्किल है। – AnthonyLambert

0

आप ब्रेकपॉइंट्स के बजाए आवेषण का भी उपयोग कर सकते हैं। उदाहरण के लिए, आप केवल दूसरी बार आपको लगता है कि समारोह फोन पर एक पाश की 5 वीं यात्रा पर ब्रेकपाइंट करना चाहते हैं, तुम कर सकते हो:

bool breakLoop = false; 

... 
    Work(); // Will not break on 5th iteration. 
    breakLoop = true; 
    Work(); // Will break on 5th iteration. 
... 

public void Work() { 
    for(int i=0 ; i < 10 ; i++) { 
     Debug.Assert (!(breakLoop && i == 5)); 
     ... 
    } 
} 

तो सबसे पहले कॉल में काम करने के लिए है, जबकि breakLoop गलत है, लूप बिना जोर देकर दौड़ जाएगा, लूप के माध्यम से दूसरी बार टूट जाएगा।

+1

आप कोड के बिना इसे पूरा करने के लिए नियमित ब्रेकपॉइंट्स पर हिट गणना सुविधा का भी उपयोग कर सकते हैं। – Jeremy

+0

सच है, मैं जो कुछ भी demostrating था, के लिए, लेकिन मैं कॉन्फ़िगरेशन चर का उपयोग करने के साथ-साथ शर्तों को निर्धारित करने के लिए एक सामान्य प्रिंसिपल का प्रदर्शन करने की कोशिश कर रहा था जब asserts निकाल दिया जाता है। –

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

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