2013-02-20 15 views
6

मैंने इस विषय के बारे में this article on MSDN, साथ ही SO पर कुछ प्रश्न/उत्तर का अध्ययन किया, लेकिन यह नहीं समझ सकता कि नीचे कोड क्यों काम नहीं करता है (नमूना कंसोल ऐप में)।डीबगर के साथ कार्य में अपवादों को कैसे संभालें?

एमएसडीएन के अनुसार, समेकित अपवाद को फेंकने की उम्मीद है, जिसमें hello संदेश के साथ एक आंतरिक अपवाद होगा। इसके बजाए, यह hello अपवाद अनचाहे है। यह एक डीबगर के अंदर होता है।

यदि आप जारी रखें या स्टैंडअलोन चलाएं, तो यह अपेक्षा के अनुसार काम करता है। वीएस में हर समय जारी रखने से बचने का कोई तरीका है? आखिरकार, Try...Catch ब्लॉक में जो कुछ भी है, उसे माना जाता है जिसे एक थ्रेडेड प्रोग्रामिंग मॉडल में संभाला जाता है। अन्यथा, डीबगिंग एक दुःस्वप्न हो सकता है।

VB.NET

Sub Main() 
    Try 
    Task.Factory.StartNew(AddressOf TaskThatThrowsException).Wait() 
    Catch ex As AggregateException 
    Console.WriteLine(ex.ToString) 'does not get here until you hit Continue 
    End Try 
End Sub 

Private Sub TaskThatThrowsException() 
    Throw New Exception("hello") 'exception was unhandled 
End Sub 

सी #

namespace ConsoleApplication1 { 
    class Program { 
    static void Main(string[] args) { 
     try { 
     Task.Factory.StartNew(TaskThatThrowsException).Wait(); 
     } 
     catch (AggregateException ex) { 
     Console.WriteLine(ex.ToString()); //never gets here     
     } 
    } 

    static void TaskThatThrowsException() { 
     throw new Exception("hello"); //exception was unhandled    
    } 
    } 
} 

वहाँ स्पष्ट कुछ मैं यहाँ याद आ रही है है?

+0

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

+0

@usr: अब भी यह 'थ्रो न्यू अपवाद ("हैलो")' लाइन पर रुक जाता है, सभी थ्रोउन की जांच करने से यह बेहतर नहीं होता है। मैं चाहता हूं कि यह उस पर रुक न जाए, बल्कि कंसोल की प्रक्रिया करें। राइटलाइन। अन्यथा, डीबगिंग एक दुःस्वप्न हो सकता है। – Neolisk

+0

कार्यों से अपवाद StartNew में दिखाई नहीं देते हैं, केवल Wait() में। Dim MyTask = Task.Factory.StartNew (...) MyTask.Wait() पकड़ें ... – adrianm

उत्तर

2

"बस मेरा कोड सक्षम करें" सेटिंग इस पर प्रभाव डालती है। टूल्स-> विकल्प, डिबगिंग-> सामान्य-> बस मेरा कोड सक्षम करें। यदि आपने इसे चालू कर दिया है, तो यह आपके कोड को संभाल नहीं लेता है, तो यह अपवाद को अनचाहे मानता है। इस विकल्प को बंद करने का प्रयास करें।

देखें: http://msdn.microsoft.com/en-us/library/dd997415.aspx

+0

+1 देखें। ऐसा लगता है कि इस विशिष्ट मामले के लिए माइक्रोसॉफ्ट द्वारा इस दृष्टिकोण की सिफारिश की जाती है। मान लीजिए मुझे अगली बार एमएसडीएन को अधिक ध्यान से पढ़ना चाहिए, क्योंकि मुझे यकीन है कि मैंने इस सवाल से पहले इस विशेष पृष्ठ के माध्यम से जल्दी से देखा है। बहुत धन्यवाद! – Neolisk

2

यह सबसे अधिक संभावना है क्योंकि आप विजुअल स्टूडियो संवाद कह रहे हैं कि आप गलत समझ रहे हैं।

अपवाद "उपयोगकर्ता अनचाहे" है, क्योंकि कोई उपयोगकर्ता कोड नहीं है जो इसे पकड़ता है (मूल Exception), यह टीपीएल द्वारा पकड़ लिया जाता है। इसलिए, यदि आप डीबगर जारी रखते हैं, या यदि आप डीबगर के बिना अपना आवेदन चलाते हैं, तो आप जिस व्यवहार की अपेक्षा कर रहे हैं उसे देखेंगे।

+0

+1। खैर, सामान्य अपवादों के साथ, उन्हें 'कोशिश करें ... पकड़ें' ब्लॉक (और प्रकार के अनुरूप है, और निश्चित रूप से पुनर्स्थापित नहीं किया गया है) के भीतर, उन्हें संभाला माना जाता है। मैं अपने आवेदन को और कैसे डीबग करना चाहता हूं? समान मामलों में हर समय जारी रखें? क्या डिबगिंग करते समय वीएस को इन अपवादों को पकड़ने का कोई तरीका नहीं है? – Neolisk

+1

@Neolisk डीबग-> अपवाद-> अनचेक फेंक दिया – Marc

+0

@Marc: फेंक दिया गया है हर जगह पहले से अनचेक किया गया है। – Neolisk

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