24

मेरे पास कुछ कोड है जो किसी ऑब्जेक्ट से संपत्ति मान खींचने के लिए प्रतिबिंब का उपयोग कर रहा है। कुछ मामलों में गुण, अपवाद फेंक सकता है, क्योंकि वे अशक्त संदर्भ हो आदिलक्ष्यInvocationException आईडीई द्वारा बेकार के रूप में क्यों माना जाता है?

object result; 
try 
{ 
    result = propertyInfo.GetValue(target, null); 

} 
catch (TargetInvocationException ex) 
{ 
    result = ex.InnerException.Message; 
} 
catch (Exception ex) 
{ 
    result = ex.Message; 
} 

अंततः कोड ठीक से कार्य है, लेकिन जब मैं डिबगर के तहत चल रहा हूँ:

जब संपत्ति एक अपवाद फेंकता है, आईडीई डीबगर में गिर जाता है जैसे कि अपवाद बेकार था। अगर मैं अभी दौड़ता हूं, तो प्रोग्राम बहता है और अपवाद एक्सेप्शन संपत्ति में वास्तविक अपवाद के साथ लक्ष्यइनवोकेशन अपवाद के रूप में अपवाद आता है।

मैं इसे कैसे होने से रोक सकता हूं?

उत्तर

28

ऐसा लगता है कि "डिजाइन द्वारा"। क्या होता है आप की संभावना मेनू उपकरणविकल्पडिबगिंगजनरलसक्षम जस्ट माई कोड सक्षम किया हुआ है है।

रूप How to: Break on User-Unhandled Exceptions कहता है:

डीबगअपवाद संवाद "बस मेरे कोड सक्षम" एक अतिरिक्त स्तंभ (तोड़ एक अपवाद उपयोगकर्ता के बिना क्रिया है जब) से पता चलता पर है।

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

तो दो कामकाज से जुड़े हैं: मेनू में अक्षम जस्ट माई कोडउपकरणविकल्पडिबगिंगजनरलया उपयोगकर्ता के बिना क्रिया .नेट फ्रेमवर्क से चेक बॉक्स निकालें मेनू में अपवाद डीबगअपवाद संवाद।

+0

दरअसल, इससे मदद मिली: मेरे पास कहीं एक स्ट्रिंग स्वरूपण त्रुटि थी (इसके बजाय int प्रारूप में टाइमस्पैन प्रदर्शित करने का प्रयास किया गया था दिनों की संख्या) और यह त्रुटि मिली। आंतरिक अपवाद: गलत प्रारूप स्ट्रिंग। लेकिन यह फ़ॉर्मेटिंग कहां से प्राप्त किया जाए, यह जानने के लिए। जब ​​मैंने "केवल अपना कोड सक्षम करें" चेक किया, तो अनचाहे अपवाद ने तुरंत दिखाया कि यह समस्या थी। –

4

संपादित करें: मैंने अभी यह कोशिश की है, और ऐसा लगता है कि प्रतिबिंब का थोड़ा अलग व्यवहार किया जाता है। आप एक प्रतिबिंब कॉल के बारे में सोचना चाहते हैं, जहां तक ​​डीबगर का संबंध है, "हैंडल" का एक नया स्तर शुरू करना: कुछ भी उस अपवाद को पकड़ रहा है, इसे अनुवादित करने से पहले और TargetInvocationException के रूप में पुनर्स्थापित किया गया है, इसलिए यह टूट जाता है। पता है कि इसमें अवरोध करने का कोई तरीका है - लेकिन क्या यह अक्सर होता है? यदि आप नियमित रूप से बहुत से संचालन कर रहे हैं जिसके परिणामस्वरूप अपवाद हैं, तो आप अपने डिज़ाइन पर पुनर्विचार करना चाहेंगे।


मूल जवाब

डीबग पर जाएं/अपवाद ... और देखते हैं कि सेटिंग नहीं है। TargetInvocationException (या पदानुक्रम में उच्चतर कुछ) में आपको यह व्यवहार दिखाई देगा, जिसमें "फेंक दिया गया" टिकबॉक्स चेक किया गया है।

+0

उपयोग केस उन चर के लिए "घड़ी विंडो" है जो मेरा ऐप उपयोग कर रहा है। उपयोगकर्ता को एप्लिकेशन में क्या हो रहा है की स्थिति दिखाने में सक्षम होने के लिए। तो यह तब होता है जब उपयोगकर्ता घड़ी विंडो को अद्यतन करने का अनुरोध कर रहा है। रनटाइम पर यह वास्तव में एक समस्या नहीं है क्योंकि अपवाद अंततः पकड़ा जाता है, लेकिन विकास के दौरान यह एक बड़ा दर्द है क्योंकि यह मुझे दौड़ने से बाहर तोड़ता रहता है! –

+1

मेरा पहला जॉन स्कीट प्रतिक्रिया! –

+0

@ जेसन: हाँ, मैं देख सकता हूं कि दर्द होना। मैं इसके चारों ओर एक रास्ता नहीं जानता मैं डर रहा हूँ। ज्यादातर स्थितियों के लिए यह शायद सही व्यवहार है। –

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