जैसा कि आपके उदाहरण पहले से ही दिखाते हैं, ऐसे प्रत्येक मामले का अलग-अलग मूल्यांकन किया जाना चाहिए और "असाधारण परिस्थितियों" और "प्रवाह नियंत्रण" के बीच ग्रे का काफी स्पेक्ट्रम है, खासकर यदि आपका तरीका पुन: प्रयोज्य होने का इरादा है, और काफी अलग-अलग पैटर्न में उपयोग किया जा सकता है मूल रूप से इसके लिए डिज़ाइन किया गया था। हम सभी से यह उम्मीद न करें कि "गैर-असाधारण" का मतलब क्या है, इस पर सहमत होने के लिए, खासकर यदि आप तुरंत "अपवाद" का उपयोग करने की संभावना पर चर्चा करते हैं।
हम इस बात पर भी सहमत नहीं हो सकते हैं कि डिज़ाइन किस कोड को पढ़ने और बनाए रखने के लिए सबसे आसान बनाता है, लेकिन मैं यह मानूंगा कि लाइब्रेरी डिजाइनर की उस पर स्पष्ट व्यक्तिगत दृष्टि है और केवल इसमें शामिल अन्य विचारों के खिलाफ इसे संतुलित करने की आवश्यकता है।
संक्षिप्त जवाब
जब आप बहुत तेज़ तरीके डिज़ाइन कर रहे हों तो अपनी आंत की भावनाओं का पालन करें और अप्रत्याशित पुन: उपयोग की संभावना की उम्मीद करें।
लंबा जवाब
प्रत्येक भावी कॉलर स्वतंत्र रूप से त्रुटि कोड और अपवादों के बीच अनुवाद कर सकता है क्योंकि यह दोनों दिशाओं में चाहता है; यह प्रदर्शन, डिबगर-मित्रता और कुछ प्रतिबंधित अंतर-संदर्भ संदर्भों को छोड़कर दो डिज़ाइन दृष्टिकोणों को लगभग समान बनाता है। यह आमतौर पर प्रदर्शन के लिए उबलता है, तो चलो उस पर ध्यान केंद्रित करते हैं।
अंगूठे के एक नियम के रूप में, उम्मीद करें कि एक अपवाद फेंकना नियमित रिटर्न की तुलना में 200x धीमा है (वास्तव में, इसमें एक महत्वपूर्ण विचरण है)।
अंगूठे के एक अन्य नियम के रूप में, अपवाद को फेंकना अक्सर जादू के मूल्यों की सबसे बड़ी तुलना में बहुत क्लीनर कोड की अनुमति दे सकता है, क्योंकि आप प्रोग्रामर पर किसी अन्य त्रुटि कोड में त्रुटि कोड का अनुवाद नहीं कर रहे हैं, क्योंकि यह क्लाइंट कोड की कई परतों के माध्यम से यात्रा करता है एक बिंदु जहां एक सुसंगत और पर्याप्त तरीके से निपटने के लिए पर्याप्त संदर्भ है। (विशेष मामला: null
अन्य जादू मूल्यों की तुलना में यहां बेहतर किराया देने की प्रवृत्ति है क्योंकि NullReferenceException
कुछ के मामले में स्वचालित रूप से खुद को अनुवाद करने की प्रवृत्ति के कारण , लेकिन सभी प्रकार के दोष नहीं; आमतौर पर, लेकिन हमेशा नहीं, दोष के स्रोत के काफी करीब। )
तो सबक क्या है?
एक फ़ंक्शन के लिए जिसे एप्लिकेशन के जीवनकाल के दौरान बस कुछ ही बार कहा जाता है (जैसे ऐप इनिशियलाइज़ेशन), कुछ भी उपयोग करें जो आपको क्लीनर देता है, कोड को समझना आसान है। प्रदर्शन चिंता का विषय नहीं हो सकता।
फेक-फंक्शन फंक्शन के लिए, कुछ भी इस्तेमाल करें जो आपको क्लीनर कोड देता है। फिर कुछ प्रोफाइलिंग करें (यदि सभी की आवश्यकता हो) और कोड को वापस करने के लिए अपवादों को बदलें यदि वे माप या समग्र कार्यक्रम संरचना के आधार पर संदिग्ध शीर्ष बाधाओं में से हैं।
एक महंगी पुन: प्रयोज्य फ़ंक्शन के लिए, कुछ भी उपयोग करें जो आपको क्लीनर कोड देता है। यदि आपको मूल रूप से हमेशा एक नेटवर्क राउंडट्रिप से गुजरना पड़ता है या एक ऑन-डिस्क XML फ़ाइल को पार्स करना होता है, तो अपवाद को फेंकने का ओवरहेड शायद नगण्य है। किसी भी विफलता का विवरण नहीं खोना अधिक महत्वपूर्ण है, गलती से भी नहीं, "गैर-असाधारण विफलता" अतिरिक्त तेजी से वापस जाने के लिए।
एक दुबला पुन: प्रयोज्य फ़ंक्शन को अधिक विचार की आवश्यकता होती है। अपवादों को नियोजित करके, आप कॉल करने वालों पर 100 गुना धीमा होने के लिए मजबूर कर रहे हैं, जो फ़ंक्शन के शरीर के बहुत तेजी से निष्पादित होने पर, उनके (कई) कॉलों में से आधे पर अपवाद देखेंगे। अपवाद अभी भी एक डिज़ाइन विकल्प है, लेकिन आपको कॉल करने वालों के लिए एक कम ओवरहेड विकल्प प्रदान करना होगा जो इसे बर्दाश्त नहीं कर सकते। आइए एक उदाहरण देखें।
आप एक महान उदाहरण को सूचीबद्ध करते हैं Dictionary<,>.Item
, जो, शिथिल रूप से बोलते हुए, null
मानों को वापस लौटने से बदलकर KeyNotFoundException
.NET 1.1 और .NET 2.0 के बीच फेंक देते हैं (केवल तभी जब आप Hashtable.Item
इसके व्यावहारिक गैर-सामान्य अग्रदूत होने पर विचार करने को तैयार हों )। इस "परिवर्तन" का कारण यहां रुचि के बिना नहीं है। मूल्य प्रकारों (कोई अधिक मुक्केबाजी) के प्रदर्शन अनुकूलन ने मूल जादू मूल्य ( null
) को एक गैर-विकल्प बना दिया; out
पैरामीटर केवल प्रदर्शन लागत का एक छोटा सा हिस्सा वापस लाएंगे। यह उत्तरार्द्ध प्रदर्शन विचार फेंकने के ओवरहेड की तुलना में पूरी तरह से नगण्य है KeyNotFoundException
, लेकिन अपवाद डिजाइन अभी भी यहां बेहतर है। क्यों?
- रेफरी / आउट पैरामीटर हर बार अपनी लागत को पूरा करते हैं, न कि केवल "विफलता" मामले में
- कोई भी व्यक्ति जो
Contains
किसी भी कॉल को इंडेक्सर के पास कॉल कर सकता है , और यह पैटर्न पूरी तरह से स्वाभाविक रूप से पढ़ता है। यदि कोई डेवलपर चाहता है, लेकिन कॉल करना भूल जाता है Contains
, तो कोई भी प्रदर्शन समस्याएँ समाप्त नहीं हो सकती हैं; KeyNotFoundException
पर्याप्त जोर से देखा और तय किया जा रहा है।