2013-07-09 11 views
5

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

इस प्रकार, मैं की तरह कुछ है:

try { method.Invoke(obj, args); } 
catch (TargetInvocationException ex) { 
    throw ex.InnerException; 
} 

बहरहाल, यह दूर चल रही आंतरिक अपवाद स्टैक ट्रेस। मैं यहां केवल throw का उपयोग नहीं कर सकता (क्योंकि मैं एक अलग अपवाद वस्तु को पुनर्स्थापित कर रहा हूं)। मैं अपने कैच ब्लॉक में क्या कर सकता हूं यह सुनिश्चित करने के लिए कि मूल अपवाद प्रकार, संदेश, और स्टैक ट्रेस सभी के माध्यम से मिलता है?

+0

आपके प्रश्न शीर्षक में टैग रखने की आवश्यकता नहीं है। सही ढंग से टैगिंग पर्याप्त है। – spender

+0

आपको क्यों लगता है कि यह स्टैक ट्रेस को भ्रमित करना आसान बनाता है? –

उत्तर

13

जैसा कि here उत्तर दिया गया है, .NET 4.5 से शुरू करने से आप आंतरिक अपवाद को खोलने के लिए ExceptionDispatchInfo कक्षा का उपयोग कर सकते हैं।

try 
{ 
    someMethod.Invoke(); 
} 
catch(TargetInvocationException ex) 
{ 
    ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); 
} 
+1

उत्तर के रूप में चिह्नित किया जाना चाहिए। एक ही समस्या थी और यह मुझे पागल कर रहा था। – Zwirbelbart

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