2008-10-13 26 views
9

वैसे भी, मैं अपवाद को प्रचारित करने के लिए और इसे कब लपेटना है, और अंतर के बारे में थोड़ा उलझन में हूं।अपवाद हैंडलिंग प्रथाओं

फिलहाल, मेरी समझ मुझे बताती है कि अपवाद को लपेटने में ड्राइव नॉटफाउंड (आईओ में) जैसे अपवाद को शामिल करना होगा और फिर इसे सामान्य IOException के साथ लपेटना होगा।

लेकिन अपवाद का प्रचार करने की अवधारणा के साथ, क्या यह केवल कुछ ऐसा होता है जब मेरे पास खाली पकड़ क्लॉज होता है? तो एक एएसपी.नेट वेब ऐप में, यह global.asax पर प्रचार करेगा। या हाल ही में तैनात वेब ऐप के मामले में, एक अनचाहे HTTPException ने मौत की पीली स्क्रीन दी और विंडोज सर्वर पर एक लॉग लिखा (यह एक वेब ऐप है जिसे मैं पुनः लिख रहा हूं)। तो अपवाद एक विधि में होता है, इसे पृष्ठ स्तर पर प्रदर्शित कक्षा स्तर पर संभाला जा सकता है, और उसके बाद global.asax या Windows सर्वर तक चला जाता है।

मैं एक और सामान्य के साथ एक अपवाद लपेटना क्यों चाहता हूं? नियम सबसे विशिष्ट प्रकार के साथ अपवाद को संभालना है (इसलिए ड्राइव नॉटफाउंड स्पष्ट रूप से एक ड्राइव नहीं मिला है)। साथ ही, मैं अपवाद को बदलने और बदलने के बीच कैसे चयन करूं?

क्या अपवाद हैंडलिंग श्रृंखला केवल कोशिश करने और पकड़ने (या पकड़ने) खंड है? मैं शब्द से मानता हूं, हाँ।

आखिरकार, मैं कॉलस्टैक को अपवाद कैसे दूंगा?

मैं अपवाद हैंडलिंग पर एमएस PandP गाइड पढ़ा है, लेकिन मुझे लगता है कि पूरी तरह से उदाहरण सब कुछ समझने के लिए पर्याप्त मुझे संलग्न नहीं किया।

यह सवाल उद्यम लाइब्रेरी से रैप करने के लिए/एक अपवाद प्रचार क्षमता आता है और आदि यह प्रचार मैं के बारे में निश्चित नहीं हूँ, और जगह/एक अपवाद लपेटकर में मतभेद है।

साथ ही, कैच ब्लॉक (जैसे ifs/elses और उस तरह की चीजों) में जटिल त्रुटि हैंडलिंग तर्क डालना ठीक है।

धन्यवाद

उत्तर

5

यह सब के बारे में अपने कॉल करने के लिए जिसका अर्थ है सही संदेश है। मुझे संदेह है कि एक सामान्य अपवाद को एक सामान्य अपवाद में लपेटने का कारण है - जो किसी को भी मदद नहीं करता है।

एक API फ़ाइल का उपयोग के साथ कोई संबंध नहीं है, लेकिन पर्दे के पीछे एक config फ़ाइल पर पहुंचकर कि विचार करें। अगर कॉन्फ़िगरेशन फ़ाइल मौजूद नहीं है तो आप को ConfigurationException में लपेट सकते हैं ताकि सही समस्या कॉलर्स को दी जा सके।

क्यों और कैसे मैं अपवाद को कॉलस्टैक को प्रचारित करना चाहता हूं?

यदि आप इसे संभाल नहीं सकते हैं तो आप एक अपवाद प्रचारित करेंगे। यह इत्ना आसान है। अगर वहाँ कुछ भी नहीं अपने कोड या अपवाद के आसपास काम करने के लिए क्या करना चाहिए कर सकते हैं, तो यह प्रचार करते हैं। जब प्रचार, सावधान रहना कैसे आप ऐसा करते हैं:

throw; 

पूर्व वर्ष स्टैक ट्रेस फेंक देता है और बिंदु अपवाद फेंक दिया जाता है से एक और बनाता है:

throw ex; 

लिए अलग है। उत्तरार्द्ध मूल स्टैक ट्रेस संरक्षित करता है।

बेशक, यदि आप अपवाद को संभाल नहीं सकते हैं तो हो सकता है कि आप इसे पहले स्थान पर पकड़ने के लिए परेशान न हों (शायद आप लॉग इन करना चाहते हैं)।

4

मैं आमतौर पर ऐसा करते हैं:

  • व्यापार तर्क विधानसभाओं (DLLs) अपवाद संभाल नहीं है जब तक कि वे पूरी तरह
  • अपवाद है कि उम्मीद कर रहे हैं समझ रहे हैं लेकिन handleable नहीं हैं एक अपवाद प्रकार में लपेटा गया है और कॉल स्टैक को रोल करने की अनुमति है (यानी, डेटाबेस इंटरैक्शन के दौरान होने वाले सभी अलग-अलग अपवाद एक रिपोजिटरी अपवाद में फंस गए हैं और फेंक दिए गए हैं)
  • अप्रत्याशित अपवाद प्रचार करने के लिए (एक dll में एक catch(Exception ex) शामिल कभी नहीं)
  • अपवाद केवल अंतिम संभव पल में नियंत्रित किया जाता है की अनुमति है (यानी, यूआई के लिए नियंत्रक)

इसके आमतौर पर केवल दूर कॉल में ढेर करें कि आप जानते हैं कि आप क्या कर रहे हैं (वर्तमान व्यवसाय प्रक्रिया क्या है) और अपवादों को सही ढंग से कैसे संभालें।

10

नहीं 6 से कम सवाल :-)

लेकिन एक अपवाद के प्रचार की अवधारणा के साथ, यह केवल कुछ करता है, तो मैं एक खाली पकड़ खंड है होता है कि है?

एक अपवाद ऊपर की तरफ से प्रचार जब तक यह एक कैच ब्लॉक अप कॉल स्टैक है कि या तो है कि विशिष्ट अपवाद के प्रकार या कि अपवाद के पदानुक्रम के आधार प्रकार नजदीक एक अपवाद प्रकार संभालती आगे द्वारा पकड़ा जाता होगा। इसलिए, उदाहरण के लिए, सभी प्रबंधित अपवाद सिस्टम से प्राप्त होते हैं। अपवाद, इसलिए एक कैच ब्लॉक जो सिस्टम को स्वीकार करता है। अपवाद प्रत्येक प्रबंधित अपवाद को पकड़ लेगा।

मैं एक और सामान्य के साथ एक अपवाद क्यों लपेटना चाहता हूं?

मुझे यकीन नहीं है कि "लपेटें" से आपका क्या मतलब है। क्या आपका मतलब है अपवाद पकड़ना, इसे दूसरे के साथ बदलना, और नए अपवाद की आंतरिक पहचान संपत्ति के रूप में मूल जोड़ें? या कुछ और?

मुझे लगता है कि एक अधिक सामान्य अपवाद के साथ अपवाद को बदलने का शायद ही कोई अच्छा कारण है। लेकिन आप निश्चित रूप से एक और अपवाद के साथ एक अपवाद को प्रतिस्थापित कर सकते हैं, 3 या 3 से अधिक कारणों से:

  • कॉलर से कार्यान्वयन विवरण छुपाने के लिए।
  • एक अमूर्तता के स्तर को बेहतर बनाने के लिए ताकि यह कॉलर के लिए अधिक सार्थक हो।
  • एक कस्टम अपवाद फेंकने के लिए जो हाथ में समस्या के लिए बहुत विशिष्ट है।

इसके अलावा, मैं कैसे रैपिंग और एक अपवाद की जगह के बीच चयन होगा?

मैं माफी चाहता हूँ, लेकिन मैं अभी भी समझ में नहीं आता कि कैसे आप इन दोनों के रूप में विभिन्न तय कर रहे हैं।

अपवाद हैंडलिंग श्रृंखला सिर्फ ट्राई एवं कैच (या कैच) खंड है?

यहाँ क्या होता है जब एक अपवाद फेंक दिया जाता है की मूल बातें कर रहे हैं:

  • CLR स्थानीय कोशिश ... अंत कोशिश ब्लॉक के भीतर पकड़ने ब्लॉक की सूची को क्रमिक रूप से चलता है, की तलाश में स्थानीय कैच ब्लॉक के लिए अपवाद फ़िल्टर के साथ एक अपवाद फ़िल्टर के साथ फेंक दिया गया था।

  • यदि स्थानीय कैच ब्लॉक में एक अपवाद फ़िल्टर है जो फेंकने वाले सटीक अपवाद से मेल खाता है, तो उस कैच ब्लॉक में कोड निष्पादित किया जाता है, इसके बाद अंत में ब्लॉक में कोड होता है। फिर अंत प्रयास के बाद पहले कथन पर निष्पादन जारी है।

  • वैकल्पिक रूप से, अगर स्थानीय कैच ब्लॉक द्वारा निर्दिष्ट अपवाद से निकाला गया अपवाद, दूसरे चरण में वर्णित अनुसार ही कार्यवाही होती है। उदाहरण के लिए, एक अपवाद फ़िल्टर जो ArgumentException को पकड़ता है, ArgumentException, जैसे ArgumentNullException, InvalidEnumArgumentException, DuplicateWaitObjectException, और ArgumentOutOfRangeException से प्राप्त अपवादों को भी पकड़ लेगा।

  • यदि कोई स्थानीय कैच ब्लॉक फेंकने वाले अपवाद से मेल खाता है, तो सीएलआर कॉल स्टैक का बैक अप लेता है, विधि द्वारा विधि, एक कैच ब्लॉक की तलाश करता है जो अपवाद का जवाब देना चाहता है। यदि कॉल स्टैक में कोई मिलान कैच ब्लॉक नहीं मिलता है, तो अपवाद को अनचाहे माना जाता है।

  • वैकल्पिक रूप से, यदि कॉल स्टैक में कहीं मिलान करने वाला कैच ब्लॉक पाया जाता है, तो फेंकने और पकड़ के बीच प्रत्येक अंत में ब्लॉक में कोड निष्पादित किया जाता है। यह अंततः कोशिश ब्लॉक से संबंधित है जहां अपवाद फेंक दिया गया था और अंत में विधि के नीचे विधि में समाप्त किया गया था जहां अपवाद पकड़ा गया था।

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

  • यदि किसी कैच ब्लॉक के भीतर कोड किसी अन्य अपवाद को फेंकने का कारण बनता है, तो मूल अपवाद स्वचालित रूप से इनरएक्सप्शन संपत्ति का उपयोग करके नए अपवाद में जोड़ा जाता है। इस तरह, सूचनाओं के किसी भी नुकसान के बिना अपवादों को ढेर किया जा सकता है।

  • आपको एक अंतराल ब्लॉक के भीतर क्लीन-अप कोड रखने से बचना चाहिए जो अपवाद फेंक सकता है, जब तक कि कोड अपने स्वयं के प्रयास ब्लॉक में न हो।इस अतिरिक्त सुरक्षा के बिना, सीएलआर व्यवहार करता है जैसे अंततः ब्लॉक के अंत के बाद नया अपवाद फेंक दिया गया था और रिमोट कैच ब्लॉक के लिए कॉल स्टैक दिखता है जो नए अपवाद का जवाब देना चाहता है। मूल अपवाद तब तक खो जाएगा जब तक कि मूल कैच ब्लॉक ने इसे सहेजा नहीं है।

अंत में, क्यों और कैसे मैं एक अपवाद callstack अप का प्रचार करते हैं चाहेगा?

क्यों: जब भी आप विशेष रूप से अपवाद समझ में नहीं आता है और कैसे यह से उबरने के लिए पता है, तुम यह ऊपर की तरफ से प्रचार देना चाहिए।

कैसे: केवल अपवाद प्रकारों को पकड़कर आप समझते हैं और कैसे संभालेंगे। कभी-कभी आपको उचित वसूली करने के लिए किसी भी अपवाद के विवरण की आवश्यकता होती है। इस मामले में, आप इसे पकड़ सकते हैं, वसूली कर सकते हैं, फिर फेंक का उपयोग करके इसे फिर से फेंक दें; कथन।

इसके अलावा, (उदाहरण के लिए भारतीय विदेश सेवा/elses और उस तरह बातें) यह ठीक एक पकड़ने ब्लॉक में तर्क से निपटने जटिल त्रुटि डालने के लिए है।

आम तौर पर हाँ, किसी भी नए अपनी पकड़ ब्लॉक में कोड की वजह से अपवाद स्वचालित रूप से InnerException संपत्ति के माध्यम से इसे से जुड़े पुराने अपवाद होगा क्योंकि। लेकिन अगर आप इससे बच सकते हैं तो इस तंत्र को उत्तेजित करना बुद्धिमान नहीं है, इसलिए आपके पास सरल कोड है, बेहतर। अपने कैच कोड को सरल रखने का एक और अच्छा कारण यह है कि यह अक्सर आपके मुख्य-रेखा कोड के समान परीक्षण के माध्यम से नहीं जायेगा।

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