2010-09-14 26 views
6

में उचित त्रुटि हैंडलिंग मेरे पास किसी भी त्रुटि के दौरान ऐप को पकड़ने के लिए मेरे बेस नियंत्रक में ऑनएक्सेप्शन (अपवाद कॉन्टेक्स्ट फ़िल्टर कॉन्टेक्स्ट) ओवरराइड है, और फिर उन्हें लॉग इन करें। मेरे ऐप में जो समस्या आ रही है वह यह है कि कुछ विशेष त्रुटियों के लिए यह विशेष विधि चार बार निकाल दी गई है। मैं एक परिदृश्य के बारे में बताएंगे: http://localhost:180/someController/someAction?someId=XXएएसपी.नेट एमवीसी 2

और मैं गरीब वस्तु मेरी कोड में से निपटने के लिए है:

की मैं करने के लिए नेविगेट करते हैं। आईडी में पास किया गया एक अमान्य है, और यह कुछ शून्य ऑब्जेक्ट को पुनर्प्राप्त करता है, फिर, मैं अपने खराब ऑब्जेक्ट हैंडलिंग का बीसी, एक शून्य ऑब्जेक्ट पर काम करने का प्रयास करता हूं। मुझे अपवाद मिलता है।

बेसकंट्रोलर का अपवाद यहां निकाल दिया गया है।

वह शून्य वस्तु अभी भी दृश्य में वापस आ गई है, जहां दृश्य इसे किसी चीज़ से बांधने की कोशिश करता है, या आप क्या हैं।

बेसकंट्रोलर ऑनएक्सप्शन दृश्य में त्रुटि के लिए यहां फिर से निकाल दिया गया है।

अनिवार्य रूप से, मेरे लिए केवल एक त्रुटि महत्वपूर्ण है, लेकिन ट्रिकल अप प्रभाव अधिक त्रुटियों को आग लगाना और मेरे इनबॉक्स को स्पैम कर रहा है: - /।

एमवीसी 2 में त्रुटि पकड़ने का सही तरीका क्या है और यह मेरे साथ नहीं हुआ है?

उत्तर

0

सबसे पहले यह बताने के लिए कि आपको कई त्रुटियां क्यों मिल रही हैं। पहली त्रुटि आपके मॉडल या नियंत्रक में सबसे अधिक संभावना वाले शून्य ऑब्जेक्ट पर काम करने की कोशिश करने से होगी। जब संभवतः ऑब्जेक्ट मौजूद होने की अपेक्षा की जाती है तो दृश्य को एक नल ऑब्जेक्ट से बांधने का प्रयास करने पर दूसरा अपवाद प्राप्त हो रहा है। बिल्कुल सही नहीं है कि आपको 4 त्रुटियां क्यों मिल रही हैं लेकिन ऐसा इसलिए हो सकता है क्योंकि कोड उस ऑब्जेक्ट पर काम करने की कोशिश कर रहा है जो वर्तमान में शून्य है।

मेरा पहला सुझाव आपके ऑनएक्सप्शन कोड को एप्लिकेशन को एक दोस्ताना त्रुटि पृष्ठ पर रीडायरेक्ट करेगा। आप शायद प्रत्येक नए अपवाद को खा रहे हैं और वेब.कॉन्फिग को त्रुटि पृष्ठों को सही तरीके से संभाल नहीं देते हैं यदि आपके पास कोई त्रुटि पृष्ठ प्रदर्शित करने के लिए सेटअप है।

मेरा दूसरा सुझाव उन पर काम करने से पहले शून्य वस्तुओं की जांच करने के लिए कुछ कोड जोड़ना होगा। इन्हें आमतौर पर गार्ड क्लॉज कहा जाता है, और इसे लागू करने के लिए बहुत उपयोगी और उपयोगी होते हैं। इसके बाद आप किसी अपवाद को लॉग इन किए बिना त्रुटियों को संभालने के लिए एक अच्छा दोस्ताना तरीका निर्धारित कर सकते हैं यदि आपको किसी उपयोगकर्ता को "एक त्रुटि हुई है" के अलावा उपयोगकर्ता को एक दोस्ताना संदेश प्रदर्शित करने की आवश्यकता नहीं है। संदेश।

अपने नियंत्रक में उदाहरण के लिए आप एक अशक्त वस्तु के लिए जांच कर सकता है और यदि उस वस्तु अशक्त

Function Example As ActionResult 

    dim obj as Object = GetObject 

    If obj is Nothing Then 

     Return View("FriendlyNoObjectView") 

    Else 

     Return View(obj) 

    End If 

End Function 

मैं जानता हूँ कि इस vb है उपयोगकर्ता के लिए एक वैकल्पिक दृश्य पारित (खेद है कि मैं कि बेहतर तो ग # जानते हैं) लेकिन विचार वही है। अगर आप चाहते थे कि आप अभी भी एक त्रुटि के रूप में लॉग इन कर सकें, लेकिन फिर आप त्रुटि को कई बार होने से रोक देंगे। जब यह होता है तो त्रुटि को संभालने के लिए हमेशा अच्छा अभ्यास होता है और इसे स्टैक के शीर्ष तक सभी तरह से फ़्लोट करने की अनुमति न दें और कई अन्य त्रुटियों का कारण बनें।

आशा है कि इससे मदद मिलेगी कि ये आपके प्रश्नों को पढ़ने से मेरे त्वरित विचार थे।

+0

आपकी त्वरित प्रतिक्रिया के लिए धन्यवाद। मैं यहाँ कुछ स्पष्टीकरण दूंगा .. मेरे पास शून्य वस्तुओं के आसपास सुरक्षा है, बस एक अपवाद का उदाहरण देना संभव है जो सबसे आसान तरीका हो रहा है। साथ ही, त्रुटि पृष्ठ जैसा दिखाना चाहिए, यह कोई मुद्दा नहीं है। यह बस इतना आसान है कि जब कोई अपवाद होता है, और आगे अपवादों का कारण बनता है, तो वे सभी लॉग इन होते हैं, जब मैं केवल पहले के बारे में परवाह करता हूं। मैं पहली त्रुटि पर मानता हूं, एप्लिकेशन निष्पादन को रोक देगा, लेकिन ऐसा लगता है कि यह मामला नहीं है .. –

1

मैं आपको हैंडलरर विशेषता से विरासत में रहने और वहां अपवाद प्रबंधन को रोल करने की सलाह दूंगा। एक नियंत्रक पर ऑनएक्सप्शन को ओवरराइड करने का मतलब है कि आपके पास या तो बहुत सारे नियंत्रकों या बेस एक से आपके उत्तराधिकारी में अपवाद हैंडलिंग कोड है, जो किसी भी मामले में एमवीसी पाइपलाइन वास्तव में आवश्यक नहीं है।

विशेषता का उपयोग करके, आपके पास प्रति क्रिया निष्पादित त्रुटि की एक घटना होनी चाहिए, और एक बार त्रुटि को संभालने के बाद यह फिर से आग नहीं लगेगा। उम्मीद है कि यह दोहराए गए अपवाद संदेशों पर कटौती करेगा।

मैं व्यक्तिगत रूप से अपवाद हैंडलिंग के लिए विशेषताओं का उपयोग करता हूं क्योंकि यह क्लीनर और अधिक पुन: प्रयोज्य है और मेरे कार्यों में बहुत शोर से छुटकारा पाता है।

+0

यह अच्छा है, मुझे यह दृष्टिकोण पसंद है, हालांकि, मुझे अभी भी अनुरोध को पूरा करने का प्रयास करने का अनुरोध जारी है निष्पादन, और आंशिक विचारों, और विचारों पर बुलबुला, उनमें से प्रत्येक पर त्रुटियां पैदा करना। यह अपवाद है जिसे मैं दृश्यों पर प्राप्त करता हूं (पहला अपवाद, जिसे मैं लॉग करना चाहता हूं, नियंत्रक में होता है): हैंडलर 'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper' के लिए बाल अनुरोध निष्पादित करने में त्रुटि। –

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