2013-12-11 7 views
9

डिबगिंग (यह बहुत C# UnhandledException from another thread keeps looping के समान दिखता है, लेकिन यहाँ अपवाद पकड़ने की कोशिश कर नहीं कर रहा हूँ, बस कुछ लॉग इन करने का मौका मिलता)दृश्य स्टूडियो क्यों पाशन है जब UnhandledException घटनाओं

मैं कुछ बहुत ही सरल सी # कोड है

class Program 
{ 
    static void Main(string[] args) 
    { 
     AppDomain currentDomain = AppDomain.CurrentDomain; 
     //currentDomain.UnhandledException += new UnhandledExceptionEventHandler(currentDomain_UnhandledException); 

     currentDomain.UnhandledException += (sender, eventArgs) => 
      { 
       var exception = (Exception) eventArgs.ExceptionObject; 

       Console.WriteLine("Unhandled exception: " + exception.Message); 
      }; 

     throw new AccessViolationException("Bleurgh"); 
    } 
} 

यह बर्ताव करता है के रूप में मैं कंसोल से उम्मीद:

Unhandled exception: Bleurgh 
Unhandled Exception: System.AccessViolationException: Bleurgh 
    at UnhandledExceptions.Program.Main(String[] args) in c:\code\sandbox\UnhandledExceptions\UnhandledExceptions\Program.cs:line 20 

एक UnhandledException ईवेंट हैंडलर सेट है, तो एक अपवाद फेंकता लेकिन जब मैं इसे विजुअल स्टूडियो में डीबग करने का प्रयास करता हूं तो यह एक लूप में प्रवेश करता है, इवेंट हैंडलर में जाता है और फिर अपवाद को फिर से खोलने के लिए बाहर निकलता है।

वही बात तब होती है जब मैं हैंडलर को एक विशिष्ट स्थैतिक विधि के रूप में व्यक्त करता हूं।

कोई विचार क्या चल रहा है? और .NET 4.

+0

संभावित डुप्लिकेट: [प्रथम] (http://stackoverflow.com/q/11469826/395718), [दूसरे] (http://stackoverflow.com/q/1536954/395718), [तीसरे] (http: //stackoverflow.com/q/164433/395718)। – Dialecticus

उत्तर

11

यह ExceptionAssistant specfically के व्यवहार के लिए नीचे प्रतीत होता है। जब आप जारी रखते हैं, तो सहायक उस बिंदु पर कॉल स्टैक को खोलता है जिस पर अपवाद फेंक दिया जाता है - जिससे अपवाद को पुनर्स्थापित किया जा सकता है। मुझे लगता है कि यह आपको परिवर्तन करने की अनुमति देने के लिए है जो आपको अपवाद से बचने की अनुमति देगा।

यदि उपकरण \ विकल्प \ डीबगर \ जनरल के तहत आप अनचाहे अपवादों पर कॉल स्टैक को अनचेक करते हैं तो अनचेक करें, तो यह केवल एक स्वतंत्र प्रक्रिया के रूप में व्यवहार करेगा, और आप प्रक्रिया को समाप्त कर देंगे।

+4

अंत में, उत्तर मैं पिछले साल या तो देख रहा था! अब तक मैंने सोचा कि इसे उचित तरीके से विफल करना असंभव था। – Dialecticus

1

यह कैसे काम करता है डिबगर है, या हम कह करेगा, एक "सुविधा":

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

डिबगर प्रक्रिया से जुड़ा हुआ है के बाद प्रक्रिया बनाया गया था (Ctrl + F5, और उसके बाद देते हैं) तो डिबगर अंत में बिना क्रिया का अपवाद "हैंडलर" तक पहुंच जाएगा, लेकिन यह अभी भी हैंडलर प्रक्रिया समाप्ति पाएगा बाहर निकलने के बाद, और आपको उस बिंदु पर वापस लाए जहां अपवाद हुआ।

+0

दिलचस्प; अगर मैं अपने अनहैंडेड एक्सेप्शन इवेंट हैंडलर को हटा देता हूं तो डीबगर भी लूप्स को फिर से फेंकने के लिए लाइन पॉइंटर को रीसेट कर देता है। –

+0

@TimBarrass मैंने जवाब को सही किया। डीबगर के तहत प्रक्रिया बस "अचूक" हो जाती है। – Dialecticus

+0

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

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