क्या यह एक बुरी कोशिश है कि आखिरकार ब्लॉक में वापसी करना बुरा है?


128

इसलिए मैं आज सुबह कुछ कोड पर आया जो इस तरह दिखता था:

try
{
    x = SomeThingDangerous();
    return x;
}
catch (Exception ex)
{
    throw new DangerousException(ex);
}
finally
{
    CleanUpDangerousStuff();
}

अब यह कोड ठीक संकलित करता है और जैसा होना चाहिए, वैसा ही काम करता है, लेकिन यह सिर्फ एक कोशिश ब्लॉक के भीतर से वापस जाने के लिए सही नहीं लगता है, खासकर अगर वहाँ एक संबद्ध अंत में है।

मेरा मुख्य मुद्दा यह है कि क्या होता है अगर अंत में इसका कोई अपवाद नहीं है? आपके पास एक लौटाया हुआ चर है, लेकिन इससे निपटने के लिए एक अपवाद भी है ... इसलिए मुझे यह जानने में दिलचस्पी है कि दूसरे लोग एक कोशिश ब्लॉक के भीतर से लौटने के बारे में क्या सोचते हैं?


13
इस शैली का एक लाभ यह है कि आपको ब्लॉक के xबाहर घोषित करने की आवश्यकता नहीं है try। आप इसकी घोषणा को इसके उपयोग के करीब रख सकते हैं।
डेविड आर ट्रिबल

जवाबों:


169

नहीं, यह एक बुरा अभ्यास नहीं है। लाना returnजहां यह समझ में पठनीयता और रख-रखाव में सुधार और अपने कोड को समझने के लिए आसान बनाता है बनाता है। finallyअगर किसी returnबयान का सामना करना पड़ता है, तो आपको परवाह नहीं करनी चाहिए क्योंकि ब्लॉक निष्पादित हो जाएगा ।


19

अंत में किसी भी मामले को निष्पादित नहीं किया जाएगा, इसलिए यह कोई फर्क नहीं पड़ता।


9
नहीं, वास्तव में, यह सिर्फ प्लग आउट नहीं है, कुछ अपवाद हैं जिन्हें स्टैकऑवरफ़्लोएक्स अपवाद, थ्रेडबोर्टएक्ससेप्शन और आउटऑफमैमोरीएक्स अपवाद जैसे एसिंक्स अपवाद कहा जाता है जो अंततः ब्लॉक को निष्पादित नहीं करने का कारण हो सकता है। इन परिदृश्यों को संभालने के लिए विवश निष्पादन क्षेत्रों के बारे में पढ़ें।
मेहरदाद अफश्री


14

व्यक्तिगत रूप से, मैं इस तरह की कोडिंग से बचूंगा क्योंकि मुझे ऐसा महसूस नहीं होता है कि आखिरकार बयानों से पहले रिटर्न स्टेटमेंट को देखना है।

मेरा मन सरल है और यह चीजों को रैखिक रूप से संसाधित करता है। इसलिए जब मैं ड्राई रनिंग के लिए कोड के माध्यम से चलता हूं, तो मुझे यह सोचने की प्रवृत्ति होगी कि एक बार जब मैं रिटर्न स्टेटमेंट तक पहुंच सकता हूं, तो सब कुछ फॉलो नहीं करता है जो इस मामले में स्पष्ट रूप से बहुत गलत है (यह नहीं कि यह रिटर्न स्टेटमेंट को प्रभावित करेगा लेकिन क्या दुष्प्रभाव हो सकते हैं)।

इस प्रकार, मैं कोड की व्यवस्था करूंगा ताकि रिटर्न स्टेटमेंट हमेशा अंत में स्टेटमेंट्स के बाद दिखाई दे।


9

यह आपके प्रश्न का उत्तर दे सकता है

वास्तव में एक कोशिश में क्या होता है {वापसी x; } अंत में {x = null; } बयान?

यदि आपको लगता है कि यह एक अपवाद फेंक सकता है, तो उस प्रश्न को पढ़ने से यह लगता है कि आप अंततः बयान में एक और कोशिश पकड़ संरचना हो सकते हैं। मान लौटने पर कंपाइलर पता लगाएगा।

उस ने कहा, अपने कोड को वैसे भी पुनर्गठित करना बेहतर हो सकता है, इसलिए यह आपको बाद में भ्रमित नहीं करेगा या कोई और जो इस बारे में अनजान भी हो सकता है।


हम्म्म बहुत दिलचस्प है। तो इसका मतलब है कि यह सुरक्षित है, लेकिन क्या इसका मतलब यह है कि इसे टाला जाना चाहिए?
लोमैक्स

3
व्यक्तिगत रूप से मुझे लगता है कि यह आपके कोड की पठनीयता को थोड़ा मुश्किल बना देता है और यह अकेले ही मुझे कोड को संरचित करने के लिए किसी अन्य तरीके का पता लगाने के लिए पर्याप्त होगा। लेकिन वास्तव में यह सिर्फ व्यक्तिगत पसंद है।
स्पेंसर रूपर्ट

3
मैं आपकी व्यक्तिगत पसंद से सहमत हूँ :)
lomaxx

मुझे लगता है कि यह ठीक है जहां यह है। विधि मान लौटाएगी, जब तक कि कोई अपवाद न फेंका जाए; कोई बात नहीं अगर अपवाद अंततः सफाई कोड में उठता है।
लॉरेंस Dol

ध्यान दें कि अंत में लौटने पर प्रतिबंध जावा में मौजूद नहीं है (लेकिन मुझे लगता है कि प्रतिबंध एक अच्छा है - कुडोस टू सी #)।
लॉरेंस डोल

5

कार्यात्मक रूप से कोई अंतर नहीं है।

हालाँकि ऐसा न करने का एक कारण है। कई निकास बिंदुओं के साथ लंबी विधियां अक्सर पढ़ना और विश्लेषण करना अधिक कठिन होता है। लेकिन उस आपत्ति में कैच और अंततः ब्लॉक की तुलना में रिटर्न स्टेटमेंट का अधिक होना है।


मैं इसे चुनौती देता हूं क्योंकि आप अधिक घोंसले के शिकार के साथ समाप्त हो सकते हैं जो एक उच्च चक्रवाती जटिलता को पढ़ने के लिए भी कठिन बनाता है
मैट_लेटहार्जिक

3

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

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

मुझे लगता है कि रिटर्न स्टेटमेंट के साथ इतने करीने से आखिरी स्टेटमेंट के रूप में रखा गया है, दूसरों को विधि के अन्य भागों में कई रिटर्न स्टेटमेंट आने और छिड़कने की संभावना कम है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.