मैं दोनों का उपयोग करने की सलाह देते हैं।
क्यों?
वापसी कोड के साथ
"समस्या" "इस काम के लिए सही उपकरण का उपयोग करें" कि लोग अक्सर उन्हें संभालने के लिए मत भूलना है। हालांकि, अपवाद इस समस्या को हल नहीं करते हैं! लोग अभी भी अपवादों को संभाल नहीं पाते हैं (उन्हें पता नहीं है कि कुछ अपवादों को संभालने की ज़रूरत है, वे मानते हैं कि किसी को स्टैक इसे संभालेगा, या वे कैच() का उपयोग करेंगे और सभी त्रुटियों को स्क्वैश करेंगे)।
एक बिना क्रिया वापसी कोड कोड मतलब हो सकता है एक अस्थिर अवस्था में है, एक बिना क्रिया का अपवाद अक्सर की गारंटी देता है कि इस कार्यक्रम दुर्घटना होगा। क्या यह बेहतर है?
जबकि कोड लिखते समय रिटर्न कोड आसानी से पहचाना जा सकता है, यह निर्धारित करने के लिए अक्सर असंभव होता है (या केवल कठिन समय लेने वाला) यह निर्धारित करने के लिए कि आप जिस विधि को बुला रहे हैं, उसे किस अपवाद से फेंक दिया जा सकता है। यह आम तौर पर बहुत ही कम अपवाद हैंडलिंग में परिणाम देता है।
अपवादों को "त्रुटियों" के लिए उपयोग किया जाना चाहिए। इसमें कठिनाई है। अगर आप इसे खोलने का प्रयास करते समय कोई फ़ाइल नहीं मिली है, तो क्या यह एक "त्रुटि" या "अपेक्षित स्थिति" है? केवल कॉलर जानता है। हर जगह अपवादों का उपयोग अनिवार्य रूप से स्थिति की जानकारी के प्रत्येक टुकड़े को एक त्रुटि में बढ़ाता है।
आखिरकार, त्रुटि प्रबंधन कुछ प्रोग्रामर को काम करना है। यह समस्या दोनों रिटर्न कोड और अपवादों में मौजूद है।
इस प्रकार, मैं स्थिति की जानकारी ("चेतावनियां" सहित), और "गंभीर त्रुटियों" के अपवादों के लिए रिटर्न कोड का उपयोग करता हूं। .net से
उदाहरण मामला (और हाँ, कभी कभी यह मुश्किल न्यायाधीश किस श्रेणी के अंतर्गत आती है कुछ है):
Int32.Parse अपवाद फेंकता है (भले ही इसके अपवाद से कोई त्रुटि नहीं है - यह पर निर्भर है परिणाम सत्यापित करने के लिए कॉलर और परिणाम वैध होने पर स्वयं के लिए निर्णय लेते हैं)। और यह केवल एक दर्द (और एक प्रदर्शन हिट) है जिसे प्रत्येक कॉल को कोशिश/पकड़ में संलग्न करना है। और यदि आप कोशिश/पकड़ का उपयोग करना भूल जाते हैं, तो एक साधारण खाली टेक्स्ट एंट्री फ़ील्ड आपके प्रोग्राम को क्रैश कर सकता है।
इस प्रकार, Int32.TryParse() का जन्म हुआ था। यह वही काम करता है, लेकिन अपवाद के बजाय एक त्रुटि कोड देता है, ताकि आप त्रुटियों को अनदेखा कर सकें (किसी भी अवैध इनपुट के लिए 0 का डिफ़ॉल्ट मान स्वीकार कर सकते हैं)। कई वास्तविक जीवन स्थितियों में यह Int32.Parse() से उपयोग करने के लिए बहुत साफ, तेज़, आसान और सुरक्षित है।
"TryParse" नामकरण सम्मेलन का उपयोग करता है ताकि यह कॉलर को स्पष्ट कर सके कि त्रुटियां हो सकती हैं, जिन्हें सही तरीके से संभाला जाना चाहिए। एक और दृष्टिकोण (प्रोग्राम्स को त्रुटियों को बेहतर तरीके से संभालने के लिए मजबूर करने के लिए) रिटर्न कोड को आउट या रेफ पैरामीटर में बनाना है, ताकि कॉलर स्पष्ट रूप से लौटाई गई त्रुटियों को संभालने की आवश्यकता के बारे में जागरूक हो।
पुस्तक फ्रेमवर्क डिजाइन दिशानिर्देश द्वितीय एड। TryParse पैटर्न और इसका उपयोग करने के दौरान, इन सभी पर दिशानिर्देश देता है। ** अत्यधिक ** अनुशंसित पढ़ने। – TrueWill
यह एक अच्छा जवाब है – Jason
इस दृष्टिकोण के साथ एक बड़ी समस्या यह है कि आपके पास दो अलग-अलग शैलियों हैं और बहुत सारी असंगतताओं के साथ समाप्त हो सकती हैं। आपके उदाहरण में रिटर्न कोड का उपयोग करने के कारण में, यदि आप इसे खोलने के लिए फ़ाइल खोलने की अपेक्षा करते हैं और यह वहां नहीं है, तो यह एक अपवाद है। भले ही आप इसे 'File.Exists' परीक्षण से सुरक्षित रखते हैं, फिर भी फ़ाइल खोलें विफल हो सकती है क्योंकि फ़ाइल को गार्ड परीक्षण और खुले के बीच में हटा दिया गया था, इस स्थिति में यह अभी भी एक अपवाद है ... –