RemoteException एक अपवाद और में अपवाद सूची दूरस्थ तरीकों की आवश्यकता होती है जांच कर ली है निर्णय अपने फेंकता खंड नहीं है एक धार्मिक निर्णय वितरित कंप्यूटिंग विश्वसनीय बनाने के तरीके पर आधारित है। यह प्रश्न हमारे उपयोगकर्ताओं की सूची में में प्रत्येक बार आता है। मेरे पास विस्तृत प्रतिक्रिया है कि मैंने पहले पोस्ट किया था। यहां यह है कि यदि आप रुचि रखते हैं। मुझे इसे आरएमआई-उपयोगकर्ता संग्रह में नहीं मिला, इसलिए मैंने इसे नीचे शामिल किया।
मैं नहीं बल्कि एक RuntimeException से RemoteException एक जाँच की अपवाद बनाने के लिए तर्क को संबोधित करने, चाहते हैं।
1) नेटवर्क विश्वसनीय
काश कि वे थे, लेकिन वास्तव में, वे नहीं कर रहे हैं नहीं कर रहे हैं। प्रत्येक नेटवर्क में क्षणिक विफलताओं है। आप नेटवर्क रिडंडेंसी में निर्माण कर सकते हैं, लेकिन तथ्य है कि अधिकांश नेटवर्क में यह नहीं है। इंट्रानेट में क्षणिक विफलताएं होती हैं, क्योंकि इंटरनेट करता है। इसलिए, प्रत्येक आरपीसी बनाया गया, विफलता के अधीन है। विफलताओं के प्रकारों में "नेटवर्क" के साथ कुछ भी नहीं हो सकता है; यदि आपका सर्वर फ़ाइल डिस्क्रिप्टर से बाहर चला जाता है, आपके क्लाइंट को अपवाद कनेक्ट होगा। नेटवर्क नेटवर्क के अर्थ में यह विफलता नेटवर्क नहीं है; आपका सर्वर संसाधन भूखा होने की क्षणिक स्थिति में है।
आरएमआई केवल सीमित मामले को संभालने के लिए डिज़ाइन नहीं किया गया है जो पूरे नेटवर्क क्रैश होता है जब एक मशीन क्रैश हो जाती है। इस तरह के नेटवर्क को विश्वसनीय माना जाएगा, या तो सबकुछ ऊपर है या सब कुछ नीचे है - आंशिक विफलता नहीं है। आरएमआई को के लिए अधिक सामान्य श्रोताओं के लिए लक्षित किया गया है।
2) आरपीसी विफलता ग्राहक से छुपाया नहीं जा सकता
आंशिक विफलता की एक सच्चाई वितरित प्रोग्रामिंग है; ये विफलताओं को प्रोग्राम पर छिपाया नहीं जा सकता है। एक विफलता क्लाइंट में दिखाई देती है, भले ही अपवाद चेक या अनचेक अपवाद है, तो यह अभी भी दिखाई देता है। तो, इस तरह के विफलताओं को क्लाइंट को कैसे इंगित किया जाना चाहिए?
3) अपवाद अधिक मजबूत कार्यक्रमों
एक समय था जब ओक और जावा के जल्द से जल्द संस्करण जांचे हुए अपवादों नहीं था था बढ़ावा जाँच की। अपवाद हैंडलिंग सलाहकार था, और यह वहां एक असुरक्षित दुनिया था। यह हमारा समूह था (जिम वाल्डो और मुझे विशेष रूप से :-) कि ने अनुशंसा की कि संकलक द्वारा अपवाद हो। जिम अपने तर्कों में प्रेरक था, दुनिया के बारे में बता रहा है जहां मजबूत कोड शासनकाल होगा। कुछ विचार करने के बाद, जावा को अपवादों की जांच करने के लिए पुनः स्थापित किया गया था। के लिए केवल उन्हीं अपवाद जिन्हें कोई पुनर्प्राप्ति नहीं मिली थी या एप्लिकेशन त्रुटियों को प्रतिबिंबित नहीं किया जाएगा (उदा।, OutOfMemoryError, क्रमशः NullPointerException)। और दुनिया फिर से सुरक्षित थी।
कल्पना कीजिए जावा इंजीनियरों 'आश्चर्य जब जावा एपीआई और संकलक में कई अपवाद जाँच करने के लिए अनियंत्रित से बदल रहे थे, और संकलक भेद लागू किया, वे कार्यान्वयन में खुला कीड़े! तो, स्थितियों को संभालने में सबसे अच्छा प्रयास, हालांकि अच्छी तरह इरादा, पर्याप्त नहीं था। यही कारण है कि संकलक कुछ :-)
4) RemoteException एक जाँच की अपवाद
ठीक है, तो ट्रैक पर वापस यहाँ होना चाहिए के लिए उपयोगी है। के बाद से एक RemoteException एक RPC कॉल में जीवन की एक सच्चाई है (देखें # 1, # 2) और जाँच की अपवाद सुरक्षित कोड लिखने के लिए आपको जबरदस्ती (# 3), हमने सोचा कि RemoteException बनाने एक जाँच अपवाद एक था अच्छा विचार। लेखन वितरित प्रोग्राम संकलक के बिना आपको अपवादों के साथ मदद करने के लिए पर्याप्त कठिन है।
तो, कुछ तर्क दे सकते हैं कि रिमोटएक्सप्शन आउटऑफमेमरी एरर की तरह है; यदि आपका रिमोट कॉल विफल रहता है तो आपके प्रोग्राम को मृत पर गिरना चाहिए। मैं इस बिंदु से असहमत हूं। हां, में कुछ मामलों में रिमोट अपवाद से कोई वसूली नहीं है; लेकिन यदि आप विश्वसनीय विश्वसनीय प्रोग्राम लिख रहे हैं, तो आपके क्लाइंट को विफलताओं को पकड़ने और उचित रूप से पुनः प्रयास करने की आवश्यकता है। शायद आपको सर्वर से संपर्क करने की आवश्यकता है, या सॉर्ट के लेन-देन को रोकना है। यदि रिमोटएक्सप्शन संभाल नहीं है, तो यह बढ़ जाएगा और आपके क्लाइंट (yuk) को क्रैश करेगा।
दूसरों ने कहा है कुछ दूरदराज के इंटरफेस है कि स्थानीय मामले में अपवाद के साथ सौदा करने के लिए दोनों को स्थानीय और दूरदराज के मामले मामले और ग्राहक में किया जाता है नहीं करना चाहिए था, देखते हैं कि इतना RemoteException नहीं करना चाहिए को फेंकने वाले खंड में होना चाहिए और हैंडलिंग करना अनिवार्य नहीं होना चाहिए। अब, अगर हम RemoteException छोड़ दूरस्थ इंटरफ़ेस की अनुमति दी तरीकों और एक "rmic" स्विच था स्टब्स कि एक अनियंत्रित RemoteException फेंक उत्पन्न करने के लिए, ग्राहकमामले में कोई विकल्प है। अपवाद संचालन के निर्णय ग्राहक के साथ रहना चाहिए। आप एक इंटरफेस कि केवल अनियंत्रित अपवाद आप एक ग्राहक है कि उन अपवादों से निपटने में संकलक मदद चाहता है कभी नहीं लिख सकते हैं फेंकता है निर्धारित करते हैं। हम पहले से ही ऊपर के उदाहरण से देखा है कि जांचे हुए अपवादों को बढ़ावा मजबूत कोड।
एक और मुद्दा यह है कि अब पॉप और फिर से किया गया है कि डेवलपर्स करने की जरूरत है केवल स्थानीय इंटरफेस का अनुवाद और दूरस्थ इंटरफेस के रूप में उपयोग होता है। यह मामलों के एक छोटे समूह के लिए काम कर सकते हैं, लेकिन अगर इंटरफ़ेस संगामिति और आंशिक रूप से विफल और मन में कॉल विलंबता, प्रोटोकॉल इंटरफ़ेस द्वारा कब्जा कर लिया साथ नहीं बनाया गया था वितरित में उपयोग करने के लिए उपयुक्त नहीं हो सकता मामला। में संचालन idempotent बनाने के लिए पर्याप्त ऑपरेशन पास की गई है? शायद, लेकिन सबसे अधिक संभावना नहीं है।
हर में RemoteException लाना फेंकता खंड एक दर्द, लेकिन इसकी कीमत मजबूत वितरित अनुप्रयोगों के लेखन के लिए भुगतान करने के लिए की तरह लग सकता।
- एन Wollrath
कैसे लोगों को भी है कि जांचे हुए अपवादों की अवधारणा नहीं है भाषा में करते हैं? आप क्या कर सकते हैं जिसे किसी अन्य भाषा में साफ नहीं किया जा सकता है? समस्या यह है कि विफलता मानदंड है कि यह महसूस करने के बजाय "असफलताओं" को एक विशेष मामला माना जाता है। इस तरह के लोग बड़े विशाल गोटो बयान जैसे अपवादों की जांच करते हैं। राज्य परीक्षण विधियों? टाइमआउट? Naaaaah। बिग विशाल गॉट्स * "अगर sh! टी प्रशंसक हिट" *। बहुत अधिक जावा विनिर्देश और यह निश्चित रूप से ** नहीं ** पूरे जावा समुदाय को रैली करता है (उदाहरण के लिए वसंत ढांचे के प्रति उनकी बड़ी नफरत है)। – SyntaxT3rr0r
वेबिनेटर, लड़के ने एक बिल्कुल उचित सवाल पूछा। रान करने की कोई जरूरत नहीं है। – DJClayworth