2009-09-01 16 views
5

मैं एएसपी.नेट सीख रहा हूं और क्वेरीरीटिंग देख रहा था।जब मैं Response.Redirect() चलाता हूं तो मुझे एक अपवाद क्यों मिलता है?

उदाहरण मैं देख रहा था में से एक में एक रीडायरेक्ट कॉल करने के लिए एक बटन ऊपर हुक:

protected void btnSubmit_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      //throws ThreadAbortException: "Thread was being aborted" 
      Response.Redirect("Form2.aspx"); 
     } 
     catch (Exception Ex) 
     { 
      System.Diagnostics.Debug.WriteLine(Ex.Message); 
     } 
    } 

क्यों यह एक ThreadAbortException यहां फेंक करता है? क्या यह सामान्य है? क्या मुझे इसके बारे में कुछ करना चाहिए? अपवाद आमतौर पर एक अच्छी बात नहीं है, इसलिए जब मैंने इसे देखा तो मुझे डर था।

+0

http://stackoverflow.com/questions/1063625/is- कहीं नहीं -समोध-से-रोक-प्रतिक्रिया-रीडायरेक्ट-टू-वर्क-अंदर-कोशिश-पकड़-ब्लॉक –

उत्तर

12

यह डिज़ाइन द्वारा है। यह KB article व्यवहार का वर्णन करता है (Request.End() और Server.Transfer() विधियों के लिए भी)।

Response.Redirect() के लिए वहाँ एक अधिभार मौजूद है:

Response.Redirect(String url, bool endResponse) 

यदि आप, endResponse = false पारित तो अपवाद नहीं है (लेकिन क्रम वर्तमान अनुरोध पर कार्रवाई करने के लिए जारी रहेगा)।

यदि endResponse = true (या यदि आप बूल तर्क के बिना ओवरलोड का उपयोग करते हैं), अपवाद फेंक दिया जाता है और वर्तमान अनुरोध तुरंत समाप्त कर दिया जाएगा।

+2

मुझे संदेह है कि यह वास्तव में 'डिज़ाइन द्वारा' है, शायद उनके डिजाइन का दुर्भाग्यपूर्ण परिणाम? ;) – MedicineMan

+2

"डिज़ाइन द्वारा" यह इंगित नहीं करता है कि चुना गया डिज़ाइन सही है ;-) – M4N

3

यह सामान्य है। Server.Transfer() भी एक ही अपवाद फेंकता है।

ऐसा इसलिए है क्योंकि आंतरिक रूप से, दोनों विधियां Response.End() पर कॉल करती हैं, जो वर्तमान अनुरोध प्रक्रिया को तुरंत बंद कर देती है। रिक स्ट्राल में pretty good blog post है जो विश्लेषण करता है कि इन अपवादों से बचने के लिए आप इतना कुछ क्यों कर सकते हैं।

1

मेरा मानना ​​है कि आपको इस KB आलेख में instrucitons का पालन करने की आवश्यकता है। Response.Redirect कॉल Response.End(), जब तक कि आप इस व्यवहार से बचने के लिए विशेष रूप से ओवरलोड का उपयोग नहीं करते हैं। एक बार प्रतिक्रिया समाप्त हो जाने के बाद, कोई और संचालन नहीं हो सकता है इसलिए टीए एक्सा।

http://support.microsoft.com/kb/312629

2

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

ऐसा लगता है कि यह अपवादों का दुरुपयोग है, लेकिन यह वही तरीका है। यदि आप चाहते हैं तो इसे रोकने के लिए आप ओवरलोड लोड कर सकते हैं (और false पास करें) - लेकिन यदि ऐसा है, तो सुनिश्चित करें कि प्रतिक्रिया के लिए कुछ भी लिखने का प्रयास नहीं किया गया है!

1

व्यवहार पुराने एएसपी का समर्थन करने के लिए डिज़ाइन द्वारा किया गया है। एमएस से यह लिंक वर्णन कर रहा है कि आप क्या अनुभव कर रहे हैं।

http://support.microsoft.com/default.aspx?scid=kb;EN-US;312629

0

पुनर्निर्देशन() कि सिर्फ एक यूआरएल भी लेता है Response.End() के लिए एक कॉल में जो परिणाम के अधिभार कॉलिंग - जो एक ThreadAbort अपवाद फेंकता है सुनिश्चित करें कि आपके पेज में रीडायरेक्ट के बाद कोई अन्य कोड/यूसी चलाया जाता है।

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

2

Response.Redirect Response.End आंतरिक रूप से कहता है, तो यह अपवाद फेंकता है, बजाय का उपयोग करें:

Response.Redirect(url, false); 
0

हाँ। मैं उन लोगों के बाद एक एक्जिट सब कोड करता हूं लेकिन मुझे पता है कि यह नहीं पहुंचा है।

मुझे लगता है कि अगर आप चाहते थे कि आप अपवाद खा सकें और बाद में अधिक सामान ले सकें लेकिन मैं इसकी अनुशंसा नहीं करता।

0

पहले से ही उचित उत्तरों का एक समूह है। यद्यपि ध्यान देने योग्य एक अन्य बिंदु। थ्रेड एबॉर्ट अपवाद उन दुर्लभ अपवादों में से एक है जिन्हें आप पकड़ सकते हैं और कोड कर सकते हैं, लेकिन आप दबा नहीं सकते हैं। यह आपके द्वारा किए गए कार्यों के बावजूद किसी भी प्रयास/पकड़/आखिरकार ब्लॉक के अंत में स्वचालित रूप से फिर से उठाया जाता है।

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

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

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