क्या सेवा परत को सभी डाओ अपवादों को पकड़ना चाहिए और उन्हें सेवा अपवादों के रूप में लपेटना चाहिए?


23

मेरे पास तीन लेयर है स्प्रिंग वेब ऐप: डाओ, सर्विस और कंट्रोलर। एक नियंत्रक कभी भी सीधे फोन नहीं करता है, यह सेवा परत के माध्यम से करता है। अभी, ज्यादातर समय अगर डाओ अपवाद (रनटाइम) है जो संभाला नहीं गया है, तो यह एक JSP द्वारा पकड़ा जाएगा जो अंतिम उपयोगकर्ता को एक त्रुटि संदेश दिखा रहा है। क्या सेवा परत को सभी डाओ अपवादों को पकड़ना चाहिए और उन्हें सेवा अपवादों के रूप में लपेटना चाहिए?

try {
   daoInstance.someDaoMethod();
} catch(DataAccessException dae) {
   throw new ServiceException("message", dae);
}

मान लीजिए कि ServiceException रनटाइम के रूप में अच्छी तरह से है और इसे न तो संभाला जाता है। क्या केवल ServiceException के बजाय DataAccessException को फेंकने का कोई अंतर है? मैंने अभी सोचा कि प्रस्तुति परत को डेटा एक्सेस अपवाद के बारे में पता नहीं होना चाहिए। लेकिन मैं उन्हें लपेटने के लिए अपरिवर्तनीय अपवादों को पकड़ने की बात नहीं देखता।

जवाबों:


18

मुझे लगता है कि एक महत्वपूर्ण कारक यह है कि आपके सेवा ग्राहक कौन हैं।

यदि आपकी सेवा परत आपके स्वयं के प्रोजेक्ट में परतों के बीच सिर्फ एक वास्तुशिल्प सीमा है, और सेवा क्लाइंट एक ही विश्वास के दायरे में है, तो चीजों को आराम करने के लिए इसका ठीक है, और अनियंत्रित अपवाद को नियंत्रक परत, या सेवा क्लाइंट को बाहर करने दें।

हालांकि, सार्वजनिक सामना करने वाले कोड के लिए; सेवा जो किसी तीसरे पक्ष या ग्राहक द्वारा खपत की जाती है, मुझे लगता है कि सेवा उन्मुख अपवाद के साथ किसी भी अनियंत्रित अपवाद को लपेटना क्लीनर है, मुख्य रूप से सुरक्षा चिंताओं के लिए, दूसरा ढीले युग्मन के लिए, और स्वच्छ अमूर्तता।

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

एक बाहरी सेवा क्लाइंट आपके कार्यान्वयन विवरण से चिंतित नहीं है, और वे बग या पर्यावरणीय समस्याओं के कारण अनियंत्रित अपवादों को संभाल नहीं सकते हैं। सुरक्षित अनुप्रयोगों में, डेटाबेस त्रुटियां केवल प्रचार करने के लिए पर्याप्त सुरक्षित नहीं हैं, OracleException - ORA-01234 - ...जो कि सम्मिलित की गई 3 तालिका हो सकती है। ग्राहक को किसी भी चेक / अपेक्षित अपवादों से निपटने की अनुमति दी जानी चाहिए जो इसे संभाल सकता है, और संभावित बग रिपोर्ट के रूप में बाकी सब का इलाज कर सकता है। आपकी सेवा अनुबंध एक परमाणु, सुसंगत, लेन-देन का अमूर्त होना चाहिए। यदि यह अपवाद के बारे में कुछ नहीं कर सकता है, तो केवल उपयोगी चीज आपको बग रिपोर्ट देना है। आपके पास पहले से ही अपवाद को लॉग इन करने की क्षमता है, इसलिए विवरण के साथ अपने अंतिम उपयोगकर्ता को क्यों बोझ दें? आपके ऐप की निगरानी की जा सकती है ताकि उपयोगकर्ताओं द्वारा रिपोर्ट किए जाने से पहले ही आप अनियंत्रित अपवादों के बारे में जान सकें।

इसके अपवादों को खाने के लिए कभी भी ठीक नहीं है, न ही मैं चेक किए गए अपवादों का प्रशंसक हूं, लेकिन मैं एक ऐसी योजना रखना पसंद करता हूं जो समग्र उत्पाद की प्रकृति के लिए उपयुक्त हो।


13

नहीं, आपको वेब एप्लिकेशन में DAO अपवाद नहीं लपेटना चाहिए

यह शून्य लाभ के लिए कोड में बहुत शोर है। DAO अपवाद एक अच्छे कारण के लिए अनियंत्रित अपवाद हैं। डीएओ अपवाद से उबरने के लिए एप्लिकेशन कोड उपयोगी कुछ भी नहीं कर सकता है। असली समस्या यहाँ है:

... यह एक JSP द्वारा पकड़ा जाएगा जो अंतिम उपयोगकर्ता को एक त्रुटि संदेश दिखा रहा है।

संपूर्ण कोड आधार को क्रिप करने के बजाय इस समस्या को एक स्थान पर ठीक करें।

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

NB: यदि आप अपने आप को बहुत थकाऊ कोड लिखते हुए पाते हैं, उदाहरण के लिए, कैच ब्लॉक का एक गुच्छा बनाते हैं जो बस लपेटते हैं और पुन: फेंकते हैं, तो लगभग हमेशा एक बेहतर समाधान होता है।


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

7

एक मुख्य कारण अपवाद रैपिंग का उपयोग करना होगा जो कि व्यापार परत में कोड को सिस्टम में हर संभावित अपवाद के बारे में जानने से रोकता है । इसके दो मुख्य कारण हैं:

  • संगति: कॉल स्टैक के शीर्ष की ओर अपवाद घोषित। यदि आप अपवादों को लपेटते नहीं हैं, बल्कि उन्हें फेंकने के अपने तरीकों की घोषणा करके उन्हें पास करते हैं, तो आप शीर्ष स्तर के तरीकों के साथ समाप्त हो सकते हैं जो कई अलग-अलग अपवादों की घोषणा करते हैं। प्रत्येक विधि में इन सभी अपवादों को घोषित करने से कॉल स्टैक थकाऊ हो जाता है।

  • एनकैप्सुलेशन: आप अपने शीर्ष स्तर के घटकों को नीचे के स्तर के घटकों के बारे में कुछ भी नहीं जानना चाह सकते हैं, न ही वे अपवाद। उदाहरण के लिए, डीएओ इंटरफेस और कार्यान्वयन का उद्देश्य बाकी एप्लिकेशन से दूर डेटा एक्सेस के विवरण को निरस्त करना है। अब, यदि आपके DAO तरीकों ने SQLException को फेंक दिया है, तो DAO का उपयोग करने वाले कोड को उन्हें पकड़ना होगा। क्या होगा अगर आप एक डेटाबेस से बजाय एक वेब सेवा से डेटा पढ़ने वाले कार्यान्वयन में बदल जाते हैं? तब आपको DAO विधियों को RemoteException और SQLException दोनों को फेंकना होगा। और, यदि आपके पास कोई DAO है जो किसी फ़ाइल से डेटा पढ़ता है, तो आपको IOException को भी फेंकना होगा। यह तीन अलग-अलग अपवाद हैं, प्रत्येक अपने स्वयं के डीएओ कार्यान्वयन के लिए बाध्य हैं।

तो, संक्षेप में, जवाब हाँ है!


3
जेपीए कार्यान्वयन (जैसे हाइबरनेट) अनियंत्रित अपवादों को फेंक देते हैं। उन्हें घोषित या पकड़े जाने की आवश्यकता नहीं है।
केविन क्लाइन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.