किसी ने भी ExceptionDispatchInfo.Capture( ex ).Throw()
और सादे के बीच के अंतर को नहीं समझाया है throw
, इसलिए यहां यह है।
पकड़े गए अपवाद को फिर से उखाड़ने का पूरा तरीका है ExceptionDispatchInfo.Capture( ex ).Throw()
(केवल .Net 4.5 से उपलब्ध)।
नीचे इस परीक्षण के लिए आवश्यक मामले हैं:
1।
void CallingMethod()
{
//try
{
throw new Exception( "TEST" );
}
//catch
{
// throw;
}
}
2।
void CallingMethod()
{
try
{
throw new Exception( "TEST" );
}
catch( Exception ex )
{
ExceptionDispatchInfo.Capture( ex ).Throw();
throw; // So the compiler doesn't complain about methods which don't either return or throw.
}
}
3।
void CallingMethod()
{
try
{
throw new Exception( "TEST" );
}
catch
{
throw;
}
}
4।
void CallingMethod()
{
try
{
throw new Exception( "TEST" );
}
catch( Exception ex )
{
throw new Exception( "RETHROW", ex );
}
}
केस 1 और केस 2 आपको एक स्टैक ट्रेस देगा जहां CallingMethod
विधि के लिए स्रोत कोड लाइन लाइन की लाइन संख्या है throw new Exception( "TEST" )
।
हालाँकि, केस 3 आपको एक स्टैक ट्रेस देगा जहाँ CallingMethod
विधि के लिए सोर्स कोड लाइन throw
कॉल की लाइन नंबर है । इसका मतलब है कि यदि throw new Exception( "TEST" )
रेखा अन्य परिचालनों से घिरी है, तो आपको इस बात का कोई पता नहीं है कि वास्तव में किस लाइन नंबर पर अपवाद को फेंक दिया गया था।
केस 4 केस 2 के साथ समान है क्योंकि मूल अपवाद की लाइन संख्या संरक्षित है, लेकिन यह वास्तविक पुनरावृत्ति नहीं है क्योंकि यह मूल अपवाद के प्रकार को बदलता है।