2010-02-03 25 views
13

क्या क्लास कन्स्ट्रक्टर में अपवाद हैंडलिंग कोड होना वैध है, या इसे टालना चाहिए? क्या किसी को कन्स्ट्रक्टर में अपवाद-उत्पन्न कोड होने से बचना चाहिए?क्या कन्स्ट्रक्टर में अपवाद हैंडलिंग डालना अच्छा अभ्यास है?

+2

भाषा? (यह मायने रखता है, कुछ हद तक, यहां ...) –

+0

मेरा मतलब एक सामान्य भाषा स्वतंत्र प्रश्न के रूप में था ... बस सामान्य ओओपी मानकों। – froadie

+1

हां, लेकिन दुर्भाग्यवश, यह एक ऐसा मामला है जहां भाषा की पसंद का सब कुछ सामान्य दिशानिर्देशों पर असर पड़ता है। –

उत्तर

9

हां, यह बिल्कुल उचित है।

class List { 
    public List(int length) { 
     if(length < 0) { 
      throw new ArgumentOutOfRangeException(
       "length", 
       "length can not be negative" 
      ); 
     } 
     // okay, go! 
    } 
} 

एक List नकारात्मक लंबाई के साथ सबसे निश्चित रूप से असाधारण है: और कैसे आप इस तरह एक परिस्थिति के लिए होगा। आप इसे कॉलर पर वापस जाने नहीं दे सकते हैं और उन्हें लगता है कि निर्माण सफल रहा है। विकल्प क्या है, CheckIfConstructionSucceeded इंस्टेंस सदस्य फ़ंक्शन? Yucky।

या

class FileParser { 
    public FileParser(string path) { 
     if(!File.Exists(path)) { 
      throw new FileNotFoundException(path); 
     } 
     // okay, go! 
    } 
} 

फिर के बारे में क्या है, यह एक फेंक है और कुछ नहीं स्वीकार्य है।

+1

क्या यह कोड संपत्ति (लम्बाई) सेटर विधि में नहीं होना चाहिए? – froadie

+3

@froadie: कोई रास्ता नहीं। – jason

+0

यदि लंबाई कभी ऋणात्मक नहीं हो सकती है, तो ऐसा लगता है कि कन्स्ट्रक्टर इसे अनुमति नहीं देता है, तो मुझे लगता है कि एक सेट लम्बाई() सेटर विधि होगी जो वैध लंबाई लागू करती है। इसे कन्स्ट्रक्टर में संभालने का क्या कारण होगा? (क्या मुझे यहां कुछ याद आ रहा है?) – froadie

4

मान लिया जाये कि यह, सी ++ तुम्हारे बारे में बात कर रहे हैं अपवाद को ऊपर उठाने के लिए वास्तव में एक निर्माता में त्रुटियों का संकेत करने के लिए एक ही रास्ता है - तो यह निश्चित रूप से परहेज नहीं किया जाना चाहिए (*)

कंस्ट्रक्टर्स अंदर अपवाद हैंडलिंग के रूप में, यह यह भी पूरी तरह मान्य है, यह देखते हुए कि आप वास्तव में अपवाद को संभाल सकते हैं। बस यहां सामान्य नियम का पालन करें: उस स्तर पर अपवादों को पकड़ें जहां आप उन्हें संभाल सकते हैं/उनके बारे में कुछ सार्थक कर सकते हैं।

(*) जब तक आप पंथ कि सी में अपवाद से बचा जाता है ++

3

सी ++ में नहीं कर रहे हैं के रूप में, ctors सबसे अच्छा वापस ऊपर अपवाद फेंकने के लिए रखा जाता है। FAQ:17.2

3

मेरा मानना ​​है कि ऑब्जेक्ट के निर्माण को रोकने के लिए एक निर्माता में अपवाद फेंकना वैध है।

2

सामान्यतः, मुझे लगता है कि जब भी रचनाकारों में संभव हो तो अपवाद उत्पन्न कोड से बचा जाना चाहिए। यह बहुत ही भाषा विशिष्ट है, हालांकि - कुछ भाषाओं में, अपवादों को फेंकने वाले रचनाकार अप्राप्य मुद्दों का कारण बनते हैं, लेकिन कुछ अन्य भाषाओं में, यह ठीक है।

व्यक्तिगत रूप से, मैं अपने रचनाकारों को वस्तु को वैध स्थिति में रखने के लिए जितना संभव हो उतना कम करने की कोशिश करता हूं। सामान्यतः, इसका मतलब यह होगा कि वे फेंकने वाले नहीं हैं, जब तक कि यह वास्तव में अपवाद नहीं है (जिसे मैं वास्तव में किसी भी तरह से संभाल नहीं सकता)।

+0

ठीक है, बेशक, जब संभव हो तो इसे टालना चाहिए। यह लगभग मामूली बयान है। संभवतः प्रभावी ढंग से मतलब है कि वस्तु निर्माण आगे बढ़ सकता है। यदि किसी भी कारण से वस्तु निर्माण आगे बढ़ नहीं सकता है तो अपवाद फेंक दिया जाना चाहिए। मैं आपके दूसरे पैराग्राफ से सहमत हूं। – jason

+0

@ जेसन: तकनीकी रूप से, मुझे लगता है कि यह थोड़ा कठोर है। यह एक मामूली कथन नहीं है, क्योंकि अक्सर रचनाकारों में अपवाद फेंकने से बचने के लिए डिज़ाइन निर्णय होते हैं। डेवलपर में क्या होता है यह तय करने के लिए डेवलपर पर निर्भर करता है, और वास्तव में काम करने वाले तरीकों के पैरामीटर के रूप में क्या पारित किया जाता है, आदि –

+0

तो मूल रूप से, आपको लगता है कि रचनाकारों को केवल न्यूनतम मात्रा में काम करना चाहिए, और अपवाद-प्रबंधन एक कन्स्ट्रक्टर में कोड दुर्लभ होना चाहिए? – froadie

3

कहीं भी एक अपवाद फेंकने की संभावना है, "सर्वोत्तम अभ्यास" इसे संभालने, कन्स्ट्रक्टर या अन्यथा है।

यह निर्माता के लिए जटिलता का एक और परत जोड़ने, जब से तुम सही तरीके से प्रारंभ है, भले ही एक त्रुटि होती है सब कुछ सुनिश्चित करने के लिए है, लेकिन यह गाड़ी कोड :)

0

ज़रूर होने की तुलना में बेहतर है, असफल के रूप में जल्दी के रूप में आप ऐसा कर सकते हैं! रचनाकारों के अंदर इनपुट पैराम के कुछ सत्यापन गलत हो सकते हैं, इसलिए असंगत निर्मित डेटा के साथ आगे बढ़ने के बजाय, असफल होने के लिए यह निश्चित रूप से लायक है।

 

Constructor(Param param){ 
    if(param == null) 
    throw new IllegalArgumentException(...); 
} 
 
संबंधित मुद्दे