c# - .NET पकड़ा अपवाद अप्रत्याशित रूप से अशक्त है




exception-handling mef (4)

क्या हो रहा है, इसकी व्याख्या के लिए नीचे देखें

मेरे पास वास्तव में अजीब मुद्दा है जहां पकड़ा गया अपवाद शून्य है।

कोड MEF का उपयोग करता है और रचना त्रुटियों की रिपोर्ट करने के लिए कड़ी मेहनत करता है। डीबगर का उपयोग करके मैं अपवाद को फेंका जा सकता है (एक InvalidOperationException ) लेकिन जब इसे अंतिम कैच ब्लॉक द्वारा ex चर के नीचे कोड में पकड़ा जाता है तो यह शून्य है। यह डिबगर में और कोड को सामान्य रूप से निष्पादित करते समय दोनों सच है।

static T ResolveWithErrorHandling<T>() where T : class
{
    try
    {
        IocContainer.Compose(Settings.Default.IocConfiguration);
        return IocContainer.Resolve<T>();
    }
    catch (ReflectionTypeLoadException ex)
    {
        // ... special error reporting for ReflectionTypeLoadException
    }
    catch (Exception ex)
    {
        // ex is null - that should not be possible!
        // ... general error reporting for other exception types
    }
    return null;
}

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

मैंने यह जानने के लिए कोड को बदलने की कोशिश की है कि इसका क्या प्रभाव हो सकता है:

  • यदि मैं पहला कैच ब्लॉक ( ReflectionTypeLoadException ) निकालता हूं, तो अंतिम कैच ब्लॉक में पकड़ा गया अपवाद अब शून्य नहीं है।
  • यदि मैं पहले कैच ब्लॉक में दूसरे अपवाद प्रकार को पकड़ता हूं तो अंतिम कैच ब्लॉक में पकड़ा गया अपवाद अब शून्य है।
  • यदि मैं InvalidOperationException लिए एक कैच ब्लॉक जोड़ता हूं तो पहला कैच ब्लॉक उस ब्लॉक में पकड़ा गया अपवाद शून्य नहीं है।
  • यदि मैं दो कैच ब्लॉक के बीच InvalidOperationException लिए कैच ब्लॉक जोड़ता हूं, तो उस ब्लॉक में पकड़ा गया अपवाद शून्य है।

प्रोजेक्ट कोड कॉन्ट्रैक्ट्स का उपयोग करता है और संकलक की जाँच करने के लिए कंपाइलर द्वारा उत्पन्न कोड पोस्ट-प्रोसेस होता है। दुर्भाग्य से, मैंने परियोजना पर प्रमुख सर्जरी किए बिना परीक्षण प्रयोजनों के लिए इससे छुटकारा पाने का एक तरीका खोज निकाला है।

मेरा वर्तमान समाधान ReflectionTypeLoadException को पकड़ना नहीं है और इसके बजाय सामान्य अपवाद हैंडलर में ex के प्रकार पर शाखा है।

इस "असंभव" व्यवहार के लिए क्या स्पष्टीकरण हो सकता है? ReflectionTypeLoadException कैच ब्लॉक के साथ क्या है?

असाधारण रूप से अपवाद शून्य नहीं है और यह C # मानक 15.9.5 के अनुसार शून्य नहीं हो सकता है।

हालाँकि, किसी प्रोजेक्ट में कोड कॉन्ट्रैक्ट्स का उपयोग करना डिबगर में स्थानीय वेरिएबल्स के प्रदर्शन को गड़बड़ कर सकता है क्योंकि कंपाइलर द्वारा उत्पन्न IL कोड को कॉन्ट्रैक्ट्स द्वारा फिर से लिखा जा सकता है इसलिए अंतिम IL डीबग जानकारी के साथ सिंक से थोड़ा बाहर है। मेरे मामले में ex चर को शून्य के रूप में प्रदर्शित किया जाता है यहां तक ​​कि यह भी नहीं है। आवेदन समाप्ति से ठीक पहले होने वाली त्रुटि रिपोर्टिंग की दुर्भाग्यपूर्ण प्रकृति का मतलब था कि मुझे विश्वास है कि त्रुटि रिपोर्टिंग को शून्य और ex रूप में नहीं कहा जाना चाहिए। ex मेरे कैच ब्लॉक के अंदर NullReferenceException को फेंकना। डिबगर का उपयोग करके मैं "सत्यापित" करने में सक्षम था कि ex अशक्त था, सिवाय इसके कि यह वास्तव में अशक्त नहीं था।

मेरा भ्रम इस तथ्य से कम हो गया था कि ReflectionTypeLoadException लिए एक कैच ब्लॉक डिबगर डिस्प्ले इश्यू को प्रभावित करता है।

उत्तर देने वाले सभी लोगों को बहुत बहुत धन्यवाद।


अपवाद वास्तव में अशक्त नहीं है, यह डिबगर के साथ एक समस्या है। कोड कॉन्ट्रैक्ट्स (ccrewrite) IL ऑपकोड को बदल देता है और यह डीबगर को खराब कर देता है, क्योंकि लीव्स opcodes को ऑपकोड में बदल दिया जाता है। दो ऑपकोड में अलग-अलग आकार और निर्देश परिवर्तन होते हैं, इसलिए अपवाद नाम समान होने पर डीबगर खो जाता है।

आप समस्या को हल करने के लिए डीबगर में $ अपवाद का उपयोग कर सकते हैं।


आपको यह देखना चाहिए कि किसी बिंदु पर, IocContainer एक Exception ex कैच को बाहर ex.InnerException है। यदि यह शून्य है, तो जाँच किए बिना।

C # ख़ुशी से throw null स्वीकार करता है, और catch (Exception)


मुझे भी यही स्थिति मिली है। यह एक्लिप्स डीबगर का एक बग हुआ। (वास्तव में, यह स्थिति केवल कुछ डीबगर के बग का परिणाम हो सकती है।)

ग्रहण पुनः आरंभ पर्याप्त था - रनटाइम अपवाद सामान्य हो जाता है, शून्य नहीं। अन्य डिबगर्स इतने दयालु नहीं हो सकते हैं।


मैं उसी समस्या में भाग गया। मेरे मामले में अपवाद चर (उदाहरण के लिए ex => ex1) का नाम बदलकर मुझे किसी भी अपवाद को पकड़ने की अनुमति दी गई ...







code-contracts