खोने के बिना TargetInvocationException के आंतरिक अपवाद को कैसे पुनर्स्थापित करना है मेरे पास Delegate.DynamicInvoke
का उपयोग करके कॉल करने वाले कई तरीके हैं। इनमें से कुछ विधियां डेटाबेस कॉल करती हैं और मैं SqlException
पकड़ने की क्षमता लेना चाहता हूं और TargetInvocationException
को पकड़ नहीं सकता हूं और वास्तव में गलत क्या पाया है, यह जानने के लिए अपने शिष्टाचार के माध्यम से खोजना चाहता हूं।स्टैक ट्रेस
मैं इस पद्धति का उपयोग किया गया था rethrow लिए लेकिन यह स्टैक ट्रेस को साफ करता है:
try
{
return myDelegate.DynamicInvoke(args);
}
catch(TargetInvocationException ex)
{
Func<TargetInvocationException, Exception> getInner = null;
getInner =
delegate(TargetInvocationException e)
{
if (e.InnerException is TargetInvocationException)
return getInner((TargetInvocationException) e.InnerException);
return e.InnerException;
};
Exception inner = getInner(ex);
inner.PreserveStackTrace();
throw inner;
}
PreserveStackTrace
विधि एक विस्तार विधि मैं एक और पोस्ट करने के लिए धन्यवाद तय है (मैं नहीं जानता कि यह वास्तव में क्या करता है) । बहरहाल, यह पता लगाने या तो संरक्षित करने के लिए प्रकट नहीं होता है:
public static void PreserveStackTrace(this Exception e)
{
var ctx = new StreamingContext(StreamingContextStates.CrossAppDomain);
var mgr = new ObjectManager(null, ctx);
var si = new SerializationInfo(e.GetType(), new FormatterConverter());
e.GetObjectData(si, ctx);
mgr.RegisterObject(e, 1, si);
mgr.DoFixups();
}
ध्यान देने योग्य दिलचस्प बिंदु: 4 में ExceptionDispatchInfo।5 का मतलब है कि आप आरएक्स से अलग-अलग कॉल स्टैक देखते हैं जब यह 4.0 या 4.5 को लक्षित कर रहे हैं या नहीं, इस पर निर्भर करता है कि यह अपवादों को पुनर्स्थापित कर रहा है। 4.5 को लक्षित करते समय अनचाहे ऑनरर्स को मूल स्टैक ट्रेस के साथ पुनर्स्थापित किया जाएगा, लेकिन 4.0 नहीं। –