2010-06-16 9 views
21

अद्यतन: मैं माइक्रोसॉफ्ट कनेक्ट पर एक बग रिपोर्ट दायर किया है: https://connect.microsoft.com/VisualStudio/feedback/details/568271/debugger-halting-on-exception-thrown-inside-methodinfo-invoke#detailsuncatchable अपवाद, pt 2

आप अपने मशीन पर इस समस्या को पुन: पेश कर सकते हैं, तो कृपया बग वोट दें तो यह तय किया जा सकता है!


ठीक है, मैं कुछ परीक्षण किया है और मैं बहुत ही सरल कुछ करने के लिए समस्या कम है:

मैं। अपवाद फेंकने वाली एक नई कक्षा में एक विधि बनाएं:

public class Class1 { 
    public void CallMe() { 
     string blah = null; 
     blah.ToLower(); 
    } 
} 

ii। एक विधिइन्फो बनाएं जो इस विधि को कहीं और इंगित करता है:

Type class1 = typeof(Class1); 
Class1 obj = new Class1(); 
MethodInfo method = class1.GetMethod("CallMe"); 

iii। कोशिश/पकड़ ब्लॉक में आमंत्रित करने के लिए एक कॉल लपेटें:

try { 
    method.Invoke(obj, null); // exception is not being caught! 
} catch { 
} 

iv। डीबगर के बिना प्रोग्राम चलाएं (ठीक काम करता है)।

v। अब प्रोग्राम को डीबगर के साथ चलाएं। जब अपवाद होता है तो डीबगर प्रोग्राम को रोक देगा, भले ही यह एक कैच हैंडलर में लपेटा गया हो जो इसे अनदेखा करने का प्रयास करता है। (भले ही आप कैच ब्लॉक में ब्रेकपॉइंट डालते हैं, इससे पहले कि यह पहुंच जाए, इससे पहले इसे रोक दिया जाएगा!)

वास्तव में, जब आप इसे डीबगर के बिना चलाते हैं तो अपवाद हो रहा है। एक साधारण परीक्षण परियोजना में इसे किसी अन्य स्तर पर नजरअंदाज कर दिया जा रहा है, लेकिन यदि आपके ऐप में वैश्विक अपवाद हैंडलिंग का कोई भी प्रकार है, तो यह वहां भी ट्रिगर हो जाएगा। [देखना टिप्पणियां]

यह मैं एक असली सिरदर्द पैदा कर रहा है क्योंकि यह मेरे ऐप की दुर्घटना हैंडलर, दर्द यह डिबग करने के लिए प्रयास करने के लिए है का उल्लेख नहीं ट्रिगर रहता है।

+7

+1 कारण आप समय एक समझदार उदाहरण में इस कम करने के लिए ले लिया –

+0

यहाँ देखें : http://stackoverflow.com/questions/2724703/why-does-vs2010-always-break-on-exception-from-methodinfo-invoke –

+4

क्या आपने विजुअल स्टूडियो में 'स्टॉप फेंक' के रूप में अपवाद को सक्षम किया है? रोकने के लिए यह व्यवहार, डीबग पर जाएं | अपवाद और फेंकने पर रोकें। –

उत्तर

5

मैं इसे अपने .NET 4 बॉक्स पर पुन: पेश कर सकता हूं, और आप सही हैं - यह केवल .NET 4.0 पर होता है।

यह मेरे लिए एक बग की तरह बहुत गंध करता है, और एमएस कनेक्ट पर जाना चाहिए। मेजर बमर अगर यह आपके क्रैश हैंडलर को ट्राइप कर रहा है। इस के आसपास काम करने के लिए एक गैर-सुखदायक तरीका की तरह लगता है कि आवेदित विधि को अपने हैंडलर के अंदर लपेटना है। :-(

एक बात मैं पुन: पेश नहीं कर सकते, हालांकि, दुर्घटना हैंडलर ट्रिपिंग है यहाँ मेरी कार्यक्रम है:।।

namespace trash { 
    public class Class1 { 
     public void CallMe() { 
      string blah = null; 
      blah.ToLower(); 
     } 
    } 

    class Program { 
     static void Main(string[] args) { 
      AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);   
      var class1 = typeof(Class1); 
      var method = class1.GetMethod("CallMe"); 

      try { 
       var obj = new Class1(); 
       method.Invoke(obj, null); // exception is not being caught! 
      } 
      catch (System.Reflection.TargetInvocationException) { 
       Console.Write("what you would expect"); 
      } 

     } 

     static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { 
      Console.Write("it would be horrible if this got tripped but it doesn't!"); 
     } 
    } 
} 
+0

मैं अभी तक एक परीक्षण ऐप में क्रैश हैंडलर ट्रिपिंग को पुन: उत्पन्न करने में सक्षम नहीं हूं, हालांकि मैं इस पर काम कर रहा हूं। किसी कारण से मेरा वास्तविक ऐप बहुत कठिन मर रहा है और अपवाद (जिसे मैं एक लॉग फ़ाइल में प्रिंट करता हूं) बहुत समान दिखता है। – devios1

+0

मैंने हालांकि कुछ और दिलचस्प खोजा: यदि आप डब्ल्यूपीएफ में एक संपत्ति से जुड़ते हैं जो अपवाद फेंकता है, तो जब आप इसे चलाते हैं तो डीबगर भी रुक जाएगा - आपको MethodInfo.Invoke को भी कॉल करने की आवश्यकता नहीं है! डीबग मोड में नहीं होने पर क्रैश हैंडलर ट्रिपिंग गलत लगता है, क्योंकि यह पता चला है कि यह एक अलग समस्या थी - जिसका अर्थ यह है कि यह एक वीएस -2010 बग हो सकता है। – devios1

+0

यह उत्तर मुझे मिल गया एक ही परिणाम है। असल में 'इनवॉक' के अंदर कहीं भी पकड़ है, मुझे लगता है कि वे अब गंभीरता से खेद करते हैं, लेकिन इससे सिरदर्द का कोई अंत नहीं होता है। एनबी। मुझे विश्वास है कि जब अनचाहे अपवाद हैडलर निष्पादित करेगा विंडोज के संस्करण पर निर्भर करता है! तो आप XP/Vista/7 पर अलग-अलग परिणाम प्राप्त कर सकते हैं। मेरा परीक्षण 7 पर है और UnhandledException घटना कभी नहीं आग लगती है, लेकिन यह डीबगर में रुकती है। –

-1

आप सभी अपवाद नहीं पकड़ सकते हैं। आपके उदाहरण में कुछ मान्यताओं हैं। उदाहरण के लिए, आप मानते हैं कि कॉलिंग थ्रेड पर अपवाद उठाया गया था। अन्य धागे पर अनचाहे अपवादों को पकड़ना इस बात पर निर्भर करता है कि आप किस रनटाइम का उपयोग कर रहे हैं (कंसोल, विनफॉर्म, डब्ल्यूपीएफ, एएसपी.नेट, आदि)।

इसके अतिरिक्त, सिस्टम को कॉल करें। पर्यावरण। फ़ेलफ़ास्ट() किसी भी हैंडलबल स्थिति उत्पन्न नहीं करता है - प्रक्रिया प्रभावी रूप से हस्तक्षेप के लिए कोई मौका नहीं है।

+0

वह Invoke(), BeginInvoke() नहीं बुला रहा है, इसलिए कॉल वर्तमान थ्रेड पर होता है। कुछ बाहरी कोड है जो कॉल के दौरान कॉल के दौरान हो जाता है, हालांकि। –

+0

@ डेव, लेकिन यह गारंटी नहीं देता है कि प्रश्न में शामिल विधि किसी अन्य थ्रेड को उत्पन्न नहीं करती है। मेरा दावा ऊपर रखता है। –

+0

@ डेव, इसका मतलब है, 'Invoke' द्वारा बुलाया गया तरीका, बदले में एक धागा (सीधे, या अप्रत्यक्ष रूप से) बना सकता है, मेरा मतलब यह नहीं है कि 'Invoke', मनमाने ढंग से एक और धागा बना देगा। –

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