C ++ प्रोग्रामर अपवाद विशिष्टताओं की तलाश नहीं करते हैं। वे अपवाद गारंटी की तलाश करते हैं।
मान लीजिए कि कोड के एक टुकड़े ने एक अपवाद फेंक दिया। प्रोग्रामर क्या धारणा बना सकता है जो अभी भी मान्य होगी? जिस तरह से कोड लिखा गया है, उसके अपवाद के बाद कोड क्या गारंटी देता है?
या क्या यह संभव है कि कोड का एक निश्चित टुकड़ा कभी भी फेंकने की गारंटी नहीं दे सकता है (यानी ओएस प्रक्रिया को समाप्त करने से कुछ भी कम नहीं)?
शब्द "रोल बैक" अपवादों के बारे में चर्चा में अक्सर होता है। एक वैध स्थिति में वापस लाने में सक्षम होना (जो स्पष्ट रूप से प्रलेखित है) अपवाद गारंटी का एक उदाहरण है। यदि कोई अपवाद गारंटी नहीं है, तो एक कार्यक्रम को मौके पर ही समाप्त कर दिया जाना चाहिए क्योंकि यह भी गारंटी नहीं है कि इसके बाद निष्पादित होने वाला कोई भी कोड उद्देश्य के रूप में काम करेगा - कहते हैं, यदि स्मृति दूषित हो गई है, तो कोई भी आगे का ऑपरेशन तकनीकी रूप से अपरिभाषित व्यवहार है।
विभिन्न सी ++ प्रोग्रामिंग तकनीक अपवाद गारंटी को बढ़ावा देती हैं। RAII (स्कोप-आधारित संसाधन प्रबंधन) क्लीनअप कोड को निष्पादित करने और यह सुनिश्चित करने के लिए एक तंत्र प्रदान करता है कि संसाधन सामान्य मामलों और असाधारण मामलों दोनों में जारी किए जाते हैं। ऑब्जेक्ट पर संशोधन करने से पहले डेटा की एक प्रतिलिपि बनाना, किसी को उस ऑब्जेक्ट की स्थिति को पुनर्स्थापित करने की अनुमति देता है यदि ऑपरेशन विफल हो जाता है। और इसी तरह।
इस StackOverflow प्रश्न का उत्तर महान लंबाई C ++ प्रोग्रामर को एक झलक देता है जो उन सभी संभावित विफलता मोडों को समझने के लिए जाते हैं जो उनके कोड में हो सकते हैं और विफलताओं के बावजूद प्रोग्राम स्टेट की वैधता की रक्षा करने का प्रयास कर सकते हैं। C ++ कोड का लाइन-बाय-लाइन विश्लेषण एक आदत बन जाता है।
जब C ++ (उत्पादन उपयोग के लिए) में विकसित हो रहा है, तो कोई व्यक्ति विवरणों को चमक नहीं सकता है। साथ ही, बाइनरी ब्लॉब (नॉन-ओपन-सोर्स) C ++ प्रोग्रामर्स का बैन है। अगर मुझे कुछ बाइनरी बूँद को कॉल करना है, और बूँद विफल हो जाती है, तो रिवर्स इंजीनियरिंग वह है जो एक सी ++ प्रोग्रामर आगे करेगा।
संदर्भ: http://en.cppreference.com/w/cpp/language/exception#Exception_safety - रिसेप्शन सुरक्षा के अंतर्गत देखें।
C ++ अपवाद अपवादों को लागू करने में विफल रहा। बाद में अन्य भाषाओं में विश्लेषण कहता है कि अपवाद विनिर्देश केवल व्यावहारिक नहीं हैं।
यह एक असफल प्रयास क्यों है: इसे सख्ती से लागू करने के लिए, इसे टाइप सिस्टम का हिस्सा बनना होगा। लेकिन ऐसा नहीं है। कंपाइलर अपवाद विनिर्देश के लिए जाँच नहीं करता है।
C ++ ने इसे क्यों चुना, और अन्य भाषाओं (जावा) से अनुभव क्यों साबित होता है कि अपवाद विनिर्देशन लूट है: जैसा कि एक फ़ंक्शन के कार्यान्वयन को संशोधित करता है (उदाहरण के लिए, इसे एक अलग फ़ंक्शन को कॉल करने की आवश्यकता होती है जो एक नए प्रकार का फेंक सकता है अपवाद), एक सख्त अपवाद विनिर्देश प्रवर्तन का मतलब है कि आपको उस विनिर्देश को भी अपडेट करना होगा। यह प्रचारित करता है - एक साधारण बदलाव के लिए आप दर्जनों या सैकड़ों कार्यों के अपवाद विनिर्देशों को अपडेट कर सकते हैं। अमूर्त आधार वर्गों (सी + + इंटरफेस के बराबर) के लिए चीजें बदतर हो जाती हैं। यदि इंटरफ़ेस पर अपवाद विनिर्देश लागू किया जाता है, तो इंटरफ़ेस के कार्यान्वयन को विभिन्न प्रकार के अपवादों को फेंकने वाले फ़ंक्शन को कॉल करने की अनुमति नहीं दी जाएगी।
संदर्भ: http://www.gotw.ca/publications/mill22.htm
C ++ 17 से शुरू [[nodiscard]]
होने पर, फ़ंक्शन का उपयोग फ़ंक्शन रिटर्न मानों पर किया जा सकता है (देखें: https://stackoverflow.com/questions/39327028/can-ac-function-be-declared-such-that-the-return-value —करना to be-अनदेखा )।
इसलिए अगर मैं एक कोड परिवर्तन करता हूं और जो एक नई तरह की विफलता की स्थिति का परिचय देता है (यानी एक नए प्रकार का अपवाद), तो क्या यह एक परिवर्तन है? क्या उसे कॉल करने वाले को कोड अपडेट करने के लिए मजबूर करना चाहिए, या कम से कम बदलाव के बारे में चेतावनी देनी चाहिए?
यदि आप तर्क स्वीकार करते हैं कि C ++ प्रोग्रामर अपवाद विनिर्देशों के बजाय अपवाद गारंटी की तलाश करते हैं, तो इसका उत्तर यह है कि यदि नए प्रकार की विफलता की स्थिति किसी भी अपवाद को नहीं तोड़ती है तो कोड पहले के वादों की गारंटी देता है, यह एक परिवर्तन नहीं है।