2015-12-14 4 views
5

आइटम this लेख राज्यों में संख्या 6:अगर इसे संभाला नहीं जाता है, या एक नया अपवाद बनाते हैं तो उसी अपवाद को फेंक दें?

नहीं कीमत की वजह से अपवाद फिर से फेंकने के लिए प्रयास करें। Bu अगर फिर से फेंकना आवश्यक था, तो के बजाय एक नया अपवाद बनाकर उसी अपवाद को फिर से फेंक दें। यह अतिरिक्त प्रदर्शन लाएगा। आप उस अपवाद में प्रत्येक परत में अतिरिक्त जानकारी जोड़ सकते हैं।

अच्छा लेकिन यह परतों को अलग करने का उल्लंघन करता है, है ना?

चलो कहते हैं कि मैं जो एक SQLException फेंकता डीएओ की एक विशिष्ट कार्यान्वयन करते

की मेरी सेवा परत मान लीजिए (या व्यापार परत ..) डीएओ परत से एक विधि कहता है, लेकिन अपवाद को संभालने के लिए नहीं करने का फैसला फेंक दिया।

यदि मैं दृश्य परत पर SQLException को फिर से फेंक देता हूं, तो मेरा व्यू लेयर न केवल डीएओ परत के साथ जोड़ा जाएगा, है ना?

क्या यह एक नया अपवाद फेंकने का अधिकार नहीं है, ताकि दृश्य पर निर्भर हो, नीचे एक स्तर पर, और दो नहीं?

प्रदर्शन को छोड़कर, उसी अपवाद को फेंकने के क्या फायदे हैं?

+0

इस पर निर्भर करता है कि आप इसे कैसा पकड़ते हैं। यदि आप शीर्ष-परत पर थ्रोबल को पकड़ते हैं और एक स्टैक ट्रेस और संदेश प्रिंट करते हैं तो आप कुछ भी उल्लंघन नहीं कर रहे हैं (आपका शीर्ष स्तर केवल थ्रोबल पर निर्भर करता है)। यदि आप डीएओ विशिष्ट अपवाद को पकड़ते हैं तो कुछ ख़राब हो रहा है। – Pace

+2

हां, यह मूर्खतापूर्ण सलाह है। यदि आपको पुनर्स्थापित करने की आवश्यकता है, तो एपीआई के उस स्तर के लिए अर्थपूर्ण रूप से सार्थक कुछ ऐसा फेंक दें, उस पर आपका लेना पूरी तरह से उचित लगता है – pvg

+1

मैं कल्पना नहीं कर सकता कि एक के बजाय एक नया अपवाद बनाने और फेंकने का प्रदर्शन सार्थक है किसी भी यथार्थवादी तरीके से। – Kylar

उत्तर

5

अगर मैं फिर से फेंक देखें लेयर को SQLException, मेरे लेयर देखें केवल डीएओ लेयर के लिए युग्मित नहीं किया जाएगा, ना?

यह बिल्कुल सही है।

क्या यह एक नया अपवाद फेंकने का अधिकार नहीं है, ताकि दृश्य केवल नीचे एक स्तर पर निर्भर हो, और दो नहीं?

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

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

ORA-00001: अद्वितीय बाधा (UxPatient_rec_soc) का उल्लंघन किया तो आप इस अपवाद कॉल करने के लिए प्रचार करते हैं, तो संभावना है कि वे क्या इसके साथ क्या करने के लिए कोई जानकारी नहीं है, और शायद यह भी अंतिम उपयोगकर्ताओं को यह दिखाने के हैं

यह समाधान बहुत खराब है, लेकिन क्लाइंट पर इसका प्रयास करने और समझने का विकल्प और भी नाजुक है।

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

सामान्य नोट: निष्पादन विचारों को अपवाद फेंकने/फिर से फेंकने का निर्णय लेने पर कम से कम महत्वपूर्ण होना चाहिए, क्योंकि अपवाद केवल दुर्लभ असाधारण स्थितियों में फेंक दिया जाना चाहिए। आपके इंटरफेस की स्पष्टता बहुत अधिक महत्वपूर्ण है।

3

मैं आपके साथ सहमत हूं कि आपकी परत लपेटने के लिए एक और वर्णनात्मक अपवाद फेंकना मूल एक अधिक सुविधाजनक होगा। इस मामले में SQLException एक निम्न-स्तर का मुद्दा हो सकता है जिसे एक नया और वर्णनात्मक अपवाद फेंककर व्यापार संदर्भ में व्याख्या और रखा जा सकता है।

कृपया यह भी मान लें कि आम तौर पर त्रुटि प्रबंधन का प्रदर्शन ऐसा कुछ नहीं है जिसे आप अनुकूलित करना चाहते हैं। तो यह सच है कि विधि से लौटने की तुलना में अपवाद फेंकना धीमा है, लेकिन यह तब होता है जब कुछ गलत हो जाता है। (क्योंकि आपको सामान्य प्रोग्राम प्रवाह को संभालने के लिए अपवादों का उपयोग करना चाहिए)

मुझे एक ही अपवाद फेंकने में कोई फायदा नहीं दिखता है, जब तक कि आप वास्तव में इसे लपेटकर कोई भी जानकारी नहीं जोड़ सकते। उस मामले में ऐसा मत करो।

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