जब थ्रो अपवाद पर डिबगर को न रोकें तो उसे फेंक दिया जाए और पकड़ा जाए


91

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

मैं उस नियम के अपवाद को कैसे छोड़ूं? कहीं न कहीं मेरे कोड में एक पकड़ा गया अपवाद है जो प्रोग्राम लॉजिक का हिस्सा है। इसलिए मैं स्पष्ट रूप से यह नहीं चाहता कि हर बार हिट होने के बाद डिबगर को रोकना अपवाद हो।

उदाहरण: मैं 344 लाइन पर अशक्त अपवाद (जो पकड़ा गया है) को अनदेखा करना चाहता हूं। मैं अन्य सभी अपवादों को रोकना चाहता हूं


6
जब यह अपवाद आपके प्रोग्रामिंग लॉजिक का हिस्सा है (इसके बारे में सोचें, अगर आपको वास्तव में इसे इस तरह से लागू करना है) - तो यह कम से कम खुद का बनाया, व्युत्पन्न अपवाद होना चाहिए। इस तरह आप ब्रायन के समाधान को लागू कर सकते हैं।
tanascius

यहाँ समस्या है: stackoverflow.com/questions/1957907/…
माइकल

2
@tanascius - +1 मैं ज्यादातर मामलों में सहमत हूं अपवाद एक तार्किक निर्णय के बारे में सबसे अच्छा तरीका नहीं है; हालांकि कुछ मामलों में जैसे कि अपवादों को संभालने के लिए कभी-कभी अपरिहार्य हो जाता है इसलिए फेंकना> पकड़ना> संभालना एकमात्र उचित विकल्प है।
19

2
@ औरो माफ़ करना मेरी बुर। एक साथ कई टैब को मॉडरेट करना कुशल है, लेकिन हमेशा सटीक नहीं होता है।

2
@tanascius: प्रतिक्रिया में अपना खुद का फेंकने से पहले आपको एक ज्ञात रूपरेखा अपवाद को पकड़ना पड़ सकता है। आपका सुझाव हमेशा संभव नहीं है।
दान पुजई

जवाबों:


40

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


31
मालिंजर के उत्तर और मेरे अनुभव से, यह उत्तर गलत प्रतीत होता है। DebuggerStepThroughविशेषता प्रथम मौका अपवादों के साथ डिबगर का कोई प्रभाव नहीं होता।
माइकल पेट्रोत्ता

5
@ टिम, मैंने परीक्षण किया और यह रुकना नहीं है। चेकआउट मेरा जवाब: stackoverflow.com/questions/1420390/3455100#3455100
शिमी वेइटहैंडलर

1
+1 शुद्ध .NET 4.0 के लिए VS2010 में और बिना किसी अपवाद के सिल्वरलाइट 4 कोड के लिए काम करता है।
माइक पोस्ट

6
महत्वपूर्ण नोट: यह async-wait प्रकार विधियों के लिए काम नहीं करता है। यहाँ
i3arnon

8
MSDN के अनुसार, DebuggerStepThroughविशेषता का CLR से कोई मतलब नहीं है। इसकी व्याख्या डिबगर्स द्वारा की जाती है। ऐसा लगता है कि यह विभिन्न परिस्थितियों में मज़बूती से काम नहीं करता है, और यह DebuggerHiddenमज़बूती से stackoverflow.com/a/3455100/141172
Eric J.

64

DebuggerHidden आपका दोस्त है!

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

VS2010 पर परीक्षण किया और महान काम करता है।

जबकि DebuggerStepThroughकुछ विशिष्ट डिबगर संस्करणों के लिए काम करने के लिए भी लगता है, DebuggerHiddenदोनों उत्तरों के लिए टिप्पणियों के आधार पर स्थितियों की एक विस्तृत श्रृंखला के लिए काम करता है।

ध्यान दें कि दोनों विकल्प वर्तमान में itter ब्लॉक विधियों या async / प्रतीक्षा विधियों के साथ काम नहीं करते हैं । इसे विज़ुअल स्टूडियो के बाद के अपडेट में ठीक किया जा सकता है।


VS2008 पर काम कर रहा है। आपको इसे पकड़ ब्लॉक सहित पूरी विधि पर लागू करना होगा, या आप कहीं और तोड़ देंगे
मार्क हीथ

1
मैंने उस विशेषता को एक विधि में जोड़ा और डिबगर को इसके बजाय कॉलिंग मेथॉन्ड पर रोक दिया। क्या मैं कुछ भूल रहा हूँ?
डोगल

1
इसे ऐसा होना चाहिए। उससे बचने के लिए, आपको अपवाद को संभालना होगा ... या वैकल्पिक रूप से कॉलर विधि को भी चिह्नित करें DebuggerHidden...
Shimmy Weitzhandler

1
ध्यान दें, कि अपवादों पर टूटने से बचने के लिए DebuggerStepThrough विशेषता पर्याप्त होनी चाहिए। DebuggerHidden ने DebuggerNonUserCode और DebuggerStepThrough एट्रिब्यूट दोनों के संयोजन की तरह काम किया है।
जिपरसन


14

DebuggerStepThrough एक विधि है जहाँ एक कोशिश / पकड़ में तोड़ने के लिए डिबगर को रोकने के लिए इस्तेमाल किया जा रहा है।

लेकिन यह केवल तभी काम करता है जब आप Visual Studio के डीबगिंग विकल्प (मेनू टूल / विकल्प, नोड डिबगिंग / जनरल) की सामान्य सेटिंग्स में "केवल मेरे कोड सक्षम करें" विकल्प को अनचेक नहीं करते हैं ...

Http://abhijitjana.net/2010/09/22/tips-on-debugging-using-debuggerstepthrough-attribute/ पर उस विशेषता के बारे में अधिक जानकारी

डीबगरहाइडेड बस डिबगर को उस विधि को प्रदर्शित करने से रोकेगा जहां अपवाद को फेंक दिया गया है। इसके बजाय, यह स्टैक पर पहली विधि दिखाएगा जो उस विशेषता के साथ चिह्नित नहीं है ...


1
ध्यान दें कि यह अब वीएस 2015 में डिफ़ॉल्ट रूप से काम नहीं करता है, इसे सक्षम करने के लिए वीएस ब्लॉग देखें
bhh

अफसोस की बात है कि वीएस 2015 काम के आसपास वीएस 2019 के लिए काम नहीं करता है।
जोनाथन एलन

13

अन्य उत्तर में निर्दिष्ट विशेषताएँ (और अन्य DebuggerNonUserCodeविशेषताएँ जैसे विशेषता) विज़ुअल स्टूडियो 2015 में डिफ़ॉल्ट रूप से उसी तरह से काम नहीं करती हैं। डीबगर उन विशेषताओं के साथ विधियों के बाजार में अपवादों पर विराम के पुराने संस्करणों के विपरीत टूट जाएगा। प्रदर्शन एन्हांसमेंट को बंद करने के लिए जिसने उनके व्यवहार को बदल दिया था आपको रजिस्ट्री सेटिंग बदलने की आवश्यकता है:

reg add HKCU\Software\Microsoft\VisualStudio\14.0_Config\Debugger\Engine /v AlwaysEnableExceptionCallbacksOutsideMyCode /t REG_DWORD /d 1

अधिक जानकारी दृश्य स्टूडियो ब्लॉग पर पाई जा सकती है ।

(यह शायद शीर्ष उत्तर पर एक टिप्पणी होनी चाहिए लेकिन मेरे पास पर्याप्त प्रतिनिधि नहीं है)


3

आप अपने कोड में किसी विशिष्ट स्थान पर फेंके गए एक अपवाद को बाहर निकालने में सक्षम नहीं हैं। हालाँकि आप एक विशिष्ट प्रकार की छूट को अक्षम करने में सक्षम हैं।

यदि आपका अपना कोड प्रश्न में अपवाद फेंकता है, तो मैं इसे एक अपवाद अपवाद बनाऊंगा, जो कुछ भी फिट बैठता है, और फिर इस व्युत्पन्न प्रकार पर डिबग ब्रेकिंग को अक्षम करता है।

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

ध्यान दें कि अपवादों के लिए दो प्रकार के विराम-व्यवहार हैं:

  • फेंका गया: यदि चयनित है, तो इस प्रकार के अपवाद को फेंकते ही टूट जाता है
  • उपयोगकर्ता-अनहेल्ड: यदि चयनित है, तो केवल तभी टूटता है यदि इस प्रकार का अपवाद, एक कोशिश / पकड़ द्वारा नियंत्रित नहीं किया जाता है।

आप NullReferenceException के लिए 'Thrown' में चेक को निकाल सकते हैं जो आपको हर बार आपके सिस्टम के प्रश्न में लाइन पास करने की स्थिति में ब्रेक न देने का लाभ देगा, लेकिन फिर भी यदि आपके पास कुछ अनहेल्ड NullRefer एक्सप्रेशन आ रहा है, तो आप इसे अन्य भागों में भी देख सकते हैं। प्रणाली।


3
Visual Studio 2010 में एक विधि में DebuggerStepThrough विशेषता जोड़ना डिबगर को रोकने के लिए एक अनहेल्ड अपवाद को विधि द्वारा फेंके जाने से रोक देगा।
टिम मर्फी

मैंने परीक्षण किया और इसे रोका नहीं गया; यह अभी भी बंद हो जाता है
शिमी वेइटहैंडलर

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