2011-01-10 13 views
9
catch (ThreadAbortException) 
{ } 
catch (Exception ex) 
{ 
    TraceManager.TraceException(ex, 
           (int)ErrorCode.GENERIC_EXCEPTION, 
           ex.StackTrace + "\n" + ex.Message + "\n" + VendorUrl); 
} 

यह भावना भीक्या थ्रेडएबॉर्ट अपवाद को पकड़ने और कोई कार्रवाई करने के लिए यह समझ में आता है?

catch (ThreadAbortException) 
{ } 

या इच्छा है कि कारण ThreadAbortException निगल लिया और हमेशा के लिए खो करने के लिए है?

+4

'थ्रेडएबॉर्ट अपवाद' हैंडलर के पूरा होने पर पुनर्स्थापित हो जाएगा। – Gabe

उत्तर

29

ThreadAbortException "पूरी तरह से" पकड़ा नहीं जा सकता; यह स्वचालित रूप से catch ब्लॉक के अंत में पुनर्स्थापित हो जाएगा (लिंक किए गए एमएसडीएन दस्तावेज़ पृष्ठ देखें) जब तकThread.ResetAbort पहले कहा जाता है।

तो, केवल समझदार catch ब्लॉक होगा:

catch (ThreadAbortException) 
{ 
    // possibly do something here 
    Thread.ResetAbort(); 
} 

लेकिन यह एक बहुत बुराई गंध है। ऐसा करने का शायद कोई कारण नहीं है, इसलिए आप अपने दृष्टिकोण पर पुनर्विचार करना चाहेंगे।

अद्यतन: Thread.Abort साथ इतना है कि इस समझौते पर कई सवाल हैं:

This one एक ही जवाब मैं यहाँ दे दिया है के रूप में है। This one का एक उत्तर है जो "Thread.Abort पर कभी भी कॉल न करें जब तक कि कथुलु बढ़ रहा न हो" (जिसे मैंने "बुरा गंध" में काफी नीचे गिरा दिया)।

कई अन्य भी हैं।

+1

+1: वार्डिंग नाइट-पिक। इसे पकड़ा जा सकता है - इसे फिर से फेंक दिया जाएगा। – Hogan

+0

@ होगन: थोड़ा सा शब्द दिया; अब अर्थ अधिक स्पष्ट होना चाहिए। – Jon

+0

बहुत अच्छा जवाब। अगर मैं कर सकता तो मैं इसे एक और +1 दूंगा। – Hogan

4

थ्रेडएबॉर्ट अपवाद इस तरह पकड़ा नहीं जा सकता है। जब तक आप Thread.ResetAbort() को कॉल नहीं करते हैं, तब तक यह कैच ब्लॉक के अंत में स्वचालित रूप से पुनर्स्थापित हो जाएगा;

थ्रेडएबॉर्ट अपवाद के लिए आपके पास कैच ब्लॉक होने के कारण इसे पकड़ने के प्रयास (अपवाद) ब्लॉक के बिना ऑटो-रीथ्रॉउन होने की अनुमति मिलती है।

-3

यह पकड़ा जाएगा और खो जाएगा। आपको वास्तव में अपवादों को पकड़ना चाहिए कि आप कुछ कर सकते हैं या आप लॉग इन कर सकते हैं और फिर फिर से फेंक सकते हैं (फेंक के साथ; नया फेंक नहीं [कुछ अपवाद];)।

0

यदि आप विभिन्न प्रकार के अपवादों के लिए कुछ विशिष्ट करना चाहते हैं तो यह अलग-अलग पकड़ ब्लॉक बनाता है। नहीं तो आप सिर्फ एक अपवाद पकड़

+3

मैं असहमत हूं। आप जो पकड़ रहे हैं उसके बारे में विशिष्ट होना आमतौर पर बेहतर होता है।मुझे लगता है कि अगर आपको नहीं पता कि आपके "कोशिश" ब्लॉक में किस प्रकार के अपवाद फेंक सकते हैं, तो इसका मतलब है कि आपने अपना आवेदन पर्याप्त परीक्षण नहीं दिया है। –

+0

मैं इलिया से सहमत हूं। +1 – Nick

0

एक धागे पर Thread.Abort कॉलिंग का उपयोग कर सकते प्रभावी रूप से एक ध्वज जो एक ThreadAbortException किसी भी समय कोड है कि अपवाद प्रसंस्करण नहीं है फेंक दिया और न ही finally ब्लॉकों जुड़े होने के कारण होगा सेट। Thread.ResetAbort() पर कॉल किए बिना अपवाद को पकड़ने के परिणामस्वरूप रनटाइम इसके अगले अवसर पर ThreadAbortException फेंक देगा। ऐसा व्यवहार पूरी तरह से अर्थहीन नहीं है, हालांकि, बाहरी अपवाद-फ़िल्टर ब्लॉक द्वारा अपवाद को देखा जा सकता है, इससे पहले यह सभी आंतरिक finally ब्लॉक को पूरा करने के लिए चलाएगा। चाहे वह अच्छी बात है या नहीं, आवेदन पर निर्भर करेगा।

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

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