2009-07-07 24 views
5

जावा में compiler checked exceptions है। जब मैंने सी ++ में संक्रमण किया, तो मैंने सीखा कि इसमें चेक अपवाद नहीं हैं। सबसे पहले, मैंने अपवाद हैंडलिंग का उपयोग करना जारी रखा, क्योंकि यह एक शानदार विशेषता है। हालांकि, थोड़ी देर बाद मैंने इसे छोड़ दिया, क्योंकि मुझे की स्थिति में मिला था, प्रत्येक समारोह को अपवाद फेंक सकता है। जैसे-जैसे मैं लिखने वाले कार्यों का केवल एक छोटा प्रतिशत अपवाद फेंक सकता हूं (सबसे अधिक 25% कहता हूं), मुझे उन कार्यों के लिए अपवाद हैंडलिंग करने का ओवरहेड मिला जो कुछ भी अस्वीकार्य नहीं कर सकता।अनचेक अपवादों के साथ कैसे काम करें?

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

टिप्पणी: मेरा प्रश्न समान रूप से सी ++ और सी # पर लागू होता है, और शायद अन्य सभी भाषाओं में जो कंपाइलर चेक अपवाद हैंडलिंग की सुविधा नहीं देते हैं।

+0

प्रत्येक फ़ंक्शन फेंक नहीं सकता है। घोषित किए गए कार्यों को 'नोएक्ससेप्ट' फेंक नहीं सकता है (और यदि वे कोशिश करते हैं, तो std :: terminate() को कॉल किया जाएगा)। – Shirik

उत्तर

11

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

अब जब मैं जावा लिख ​​रहा हूं, तो मुझे चेक अपवाद बहुत समय से निराशाजनक लगता है। मुझे लगता है कि वहां कहीं मूल्य है, लेकिन यह हल होने जैसी कई समस्याओं को पेश करता है।

असल में, मुझे लगता है कि हमें वास्तव में "सही" चीज़ों की पूरी त्रुटि को संभालने की ज़रूरत नहीं है, लेकिन शेष राशि पर मैं जावा दृष्टिकोण के लिए सी # दृष्टिकोण पसंद करता हूं।

+1

सहमत हुए। यह विकास में एक क्षेत्र है जिसे मुझे अभी भी कुछ शोध की जरूरत है। –

16

सरल। आप "हर फंक्शन जो फेंक सकते हैं" में अपवाद हैंडलिंग नहीं करते हैं - सी ++ में, बस हर फ़ंक्शन ऐसा कर सकता है। इसके बजाए, आप इसे अपने आवेदन के कुछ महत्वपूर्ण बिंदुओं पर करते हैं, जहां आप एक समझदार, एप्लिकेशन-विशिष्ट डायग्नोस्टिक उत्पन्न कर सकते हैं और समझदार, एप्लिकेशन-विशिष्ट सुधारात्मक कार्रवाई कर सकते हैं, हालांकि आरएआईआई मुहावरे का उपयोग करना है (जैसा कि अवकर अपने उत्तर में बताता है) कि अक्सर लेने के लिए थोड़ा सुधारात्मक कार्रवाई होती है।

+0

बिल्कुल। यही वह है जो वे हैं। कौन (कौन सा कोड) जानता है कि कैसे संभालना है संभालता है। – sharptooth

+0

डबल बिल्कुल: http: // stackoverflow भी देखें।कॉम/प्रश्न/434839/कहां-करते-आप-जैसे-पकड़-अपवाद-और-क्यों/434903 # 434903 – peSHIr

+3

सहमत हुए। आरएआईआई 99% काम करता है जिसे डेवलपर को जावा में मैन्युअल रूप से करने की ज़रूरत होती है। आपको केवल शेष 1% मामलों में अपवाद हैंडलिंग जोड़ने की आवश्यकता है। यह भी ध्यान दें कि 80% आंकड़े बनाए गए हैं लेकिन आपको मेरी बहाव मिलती है। –

4

क्या नील ने कहा कि इसके अलावा, आप क्योंकि object destructors are called भले ही एक अपवाद फेंक दिया जाता है को ध्यान देना चाहिए try/finally (या सी ++ try/catch/throw के संदर्भ में) के लिए कोई जरूरत नहीं है कि,।

बहुत कम try कथन के साथ अपवाद-सुरक्षित कोड होना आसानी से संभव है।

+0

जब नील ने आरएआईआई का उल्लेख किया तो यही वह था। –

+1

वह मेरे जवाब को भी संदर्भित करता है, जो दर्शाता है कि उसने मेरा प्रकाशित होने के बाद अपने जवाब में एक संपादन किया था। – avakar

3

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

मार्टिन यॉर्क ने this answer में इसका एक अद्भुत उदाहरण लिखा है।

फ़ंक्शन एक अपवाद फेंक सकता है, हाँ, लेकिन अगर ऐसा होता है, तो उसे साफ करने के लिए कुछ भी करने की आवश्यकता नहीं होगी। तो आपको केवल एक ही स्थान पर अपवाद को पकड़ने की आवश्यकता है - वह फ़ंक्शन जो इसे संभालने में सक्षम है और त्रुटि से पुनर्प्राप्त है।

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