कुछ 10 साल पहले स्कूल में वापस, वे आपको अपवाद निर्दिष्टताओं का उपयोग करना सिखा रहे थे। चूँकि मेरी पृष्ठभूमि उनमें से एक है, जो टॉरवेल्ड सी प्रोग्रामर हैं, जो ज़बरदस्ती सी ++ से बचते हैं, जब तक कि मुझे मजबूर नहीं किया जाता है, मैं केवल सी ++ में छिटपुट रूप से समाप्त होता हूं, और जब मैं अभी भी अपवाद निर्दिष्टकों का उपयोग करता हूं, तो वही है जो मुझे सिखाया गया था।
हालाँकि, C ++ प्रोग्रामर्स के बहुमत अपवाद विनिर्देशक पर आधारित प्रतीत होते हैं। मैंने विभिन्न C ++ गुरुओं की बहस और तर्कों को इन जैसे पढ़ा है । जहां तक मैं इसे समझता हूं, यह तीन चीजों को उबालता है:
- अपवाद विनिर्देशक एक प्रकार की प्रणाली का उपयोग करते हैं जो बाकी भाषा ("छाया प्रकार प्रणाली") के साथ असंगत है।
- यदि अपवाद के साथ आपका फ़ंक्शन निर्दिष्ट करता है तो आपके द्वारा निर्दिष्ट किए गए के अलावा और कुछ भी नहीं फेंकता है, प्रोग्राम खराब, अप्रत्याशित तरीके से समाप्त हो जाएगा।
- आगामी C ++ मानक में अपवाद विनिर्देशक हटा दिए जाएंगे।
क्या मुझे यहाँ कुछ याद आ रहा है या ये सभी कारण हैं?
मेरी अपनी राय:
1 के बारे में): तो क्या। C ++ संभवतः अब तक की सबसे असंगत प्रोग्रामिंग भाषा है, जिसे सिंटेक्स-वार बनाया गया है। हमारे पास मैक्रो, गोटो / लेबल्स, अपरिभाषित- / अनिर्दिष्ट- / अनिर्दिष्ट- / कार्यान्वयन-परिभाषित व्यवहार, खराब-परिभाषित पूर्णांक प्रकार, सभी निहित प्रकार के प्रचार नियम, विशेष-केस कीवर्ड जैसे मित्र, ऑटो , रजिस्टर, स्पष्ट ... और इसी तरह। कोई शायद C / C ++ में सभी अजीबता की कई मोटी किताबें लिख सकता है। तो लोग इस विशेष असंगति के खिलाफ प्रतिक्रिया क्यों कर रहे हैं, जो कि भाषा की कई अन्य खतरनाक विशेषताओं की तुलना में एक मामूली दोष है?
2 के बारे में): क्या मेरी अपनी जिम्मेदारी नहीं है? कई अन्य तरीके हैं जिनसे मैं C ++ में एक घातक बग लिख सकता हूं, यह विशेष मामला किसी भी बदतर क्यों है? लिखने throw(int)
और फिर क्रैश_टी को फेंकने के बजाय, मैं यह भी दावा कर सकता हूं कि मेरा फ़ंक्शन int के लिए एक संकेतक लौटाता है, फिर एक जंगली, स्पष्ट टाइपकास्ट बनाएं और एक Crash_t को सूचक लौटाएं। C / C ++ की भावना हमेशा प्रोग्रामर को अधिकांश जिम्मेदारी छोड़ने के लिए होती है।
फ़िर फायदे के बारे में क्या? सबसे स्पष्ट यह है कि यदि आपका फ़ंक्शन आपके द्वारा निर्दिष्ट के अलावा किसी भी प्रकार को स्पष्ट रूप से फेंकने की कोशिश करता है, तो संकलक आपको एक त्रुटि देगा। मेरा मानना है कि इस (?) के बारे में मानक स्पष्ट है। कीड़े केवल तब होंगे जब आपका फ़ंक्शन अन्य कार्यों को कॉल करता है जो बदले में गलत प्रकार फेंकते हैं।
नियतात्मक, एम्बेडेड सी कार्यक्रमों की दुनिया से आने वाले, मैं सबसे निश्चित रूप से यह जानना पसंद करूंगा कि एक समारोह मुझ पर क्या फेंक देगा। अगर भाषा में कुछ ऐसा है जो समर्थन करता है, तो इसका उपयोग क्यों न करें? विकल्प प्रतीत होते हैं:
void func() throw(Egg_t);
तथा
void func(); // This function throws an Egg_t
मुझे लगता है कि एक बड़ा मौका है कि कॉल करने वाला दूसरे मामले में ट्राई-कैच को लागू करने की उपेक्षा करता है / भूल जाता है, पहले मामले में कम।
जैसा कि मैं इसे समझता हूं, अगर इन दोनों रूपों में से एक या तो अचानक दूसरे प्रकार के अपवाद को फेंकने का फैसला करता है, तो कार्यक्रम क्रैश हो जाएगा। पहले मामले में क्योंकि इसे दूसरे अपवाद को फेंकने की अनुमति नहीं है, दूसरे मामले में क्योंकि किसी को भी यह उम्मीद नहीं थी कि वह स्पैनिशइन्क्वायरी_टी फेंकेगा और इसलिए यह अभिव्यक्ति नहीं पकड़ी जाएगी जहां इसे होना चाहिए था।
उत्तरार्द्ध के मामले में, कार्यक्रम के उच्चतम स्तर पर कुछ अंतिम रिज़ॉर्ट कैच (...) होना वास्तव में किसी प्रोग्राम क्रैश से बेहतर नहीं लगता है: "अरे, आपके कार्यक्रम में कहीं कुछ अजीब, बिना किसी अपवाद के फेंक दिया गया है। । "। एक बार जब आप उस प्रोग्राम को पुनर्प्राप्त नहीं कर सकते हैं, जहां से अपवाद को फेंक दिया गया था, तो केवल एक चीज जो आप कर सकते हैं वह है प्रोग्राम से बाहर निकलना।
और उपयोगकर्ता के दृष्टिकोण से, वे कम परवाह नहीं कर सकते थे यदि उन्हें ओएस से एक दुष्ट संदेश बॉक्स मिलता है जो कह रहा है "प्रोग्राम समाप्त हो गया। पता 0x12345 पर Blablabla" या आपके प्रोग्राम से एक दुष्ट संदेश बॉक्स "अनहैंड अपवाद": myassass। func.something "। बग अभी भी है।
आगामी C ++ मानक के साथ मेरे पास अपवाद निर्दिष्टकर्ताओं को छोड़ने के अलावा और कोई विकल्प नहीं होगा। लेकिन मैं इसके बजाय कुछ ठोस तर्क सुनूंगा कि वे बुरे क्यों हैं, बजाय "परम पावन ने कहा है और इस प्रकार ऐसा है"। शायद मेरे द्वारा सूचीबद्ध लोगों की तुलना में उनके खिलाफ अधिक तर्क हैं, या शायद मुझे एहसास की तुलना में उनके लिए अधिक है?