अपवाद सुरक्षा

अपवाद सुरक्षा अपवाद फेंके जाने पर सही ढंग से काम करने वाले कोड की स्थिति है। अपवाद सुरक्षा सुनिश्चित करने में सहायता के लिए, सी ++ मानक पुस्तकालय डेवलपर्स ने अपवाद सुरक्षा स्तरों का एक सेट तैयार किया है, अपवादों के संबंध में डेटा संरचना के संचालन के व्यवहार की संविदात्मक गारंटी। पुस्तकालय कार्यान्वयनकर्ता और ग्राहक इन गारंटियों का उपयोग तब कर सकते हैं जब अपवाद हैंडलिंग शुद्धता के बारे में तर्क करते हैं। अपवाद सुरक्षा स्तर अन्य भाषाओं और त्रुटि प्रबंधन तंत्रों पर समान रूप से लागू होते हैं।

इतिहास
जैसा कि डेविड अब्राहम (कंप्यूटर प्रोग्रामर) लिखते हैं, C ++ के अपवाद होने से पहले किसी ने भी 'त्रुटि-सुरक्षा' की बात नहीं की थी। 1994 में ही यह शब्द ISO/IEC JTC 1/SC 22|JTC1/SC22/WG21, C++ मानक समिति में प्रकाशनों के विषय के रूप में प्रकट हुआ। सी ++ मानक पुस्तकालय के लिए अपवाद सुरक्षा को पहली बार इब्राहीम द्वारा मानक टेम्पलेट लाइब्रेरी के लिए औपचारिक रूप से औपचारिक सुरक्षा/मजबूत सुरक्षा भेद स्थापित किया गया था। इसे बाद के प्रस्ताव में आधुनिक बुनियादी/मजबूत/नोथ्रो गारंटियों तक बढ़ाया गया था।

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


 * 1) एक परिवर्तनशील डेटा संरचना पर एक ऑपरेशन का एक चरण डेटा को संशोधित करता है और एक अपरिवर्तनीय को तोड़ता है।
 * 2) एक अपवाद को फेंक दिया जाता है और बुलबुले को नियंत्रित किया जाता है, ऑपरेशन के बाकी कोड को छोड़ दिया जाता है जो अपरिवर्तनीय को पुनर्स्थापित करेगा
 * 3) अपवाद पकड़ा गया है और इससे पुनर्प्राप्त किया गया है, या ए   ब्लॉक डाला गया है
 * 4) टूटे हुए इनवेरिएंट के साथ डेटा संरचना का उपयोग कोड द्वारा किया जाता है जो कि इनवेरिएंट को मानता है, जिसके परिणामस्वरूप बग होता है

उपरोक्त जैसे बग वाले कोड को अपवाद असुरक्षित कहा जा सकता है।

वर्गीकरण
सी ++ मानक पुस्तकालय अपवाद सुरक्षा के कई स्तर प्रदान करता है (सुरक्षा के घटते क्रम में): # नो-थ्रो गारंटी, जिसे विफलता पारदर्शिता के रूप में भी जाना जाता है: असाधारण स्थितियों में भी संचालन सफल होने और सभी आवश्यकताओं को पूरा करने की गारंटी है। यदि कोई अपवाद होता है, तो इसे आंतरिक रूप से नियंत्रित किया जाएगा और ग्राहकों द्वारा इसका अवलोकन नहीं किया जाएगा।
 * 1) मजबूत अपवाद सुरक्षा, जिसे कमिट या रोलबैक शब्दार्थ के रूप में भी जाना जाता है: संचालन विफल हो सकता है, लेकिन विफल संचालन की गारंटी है कि मूल मूल्यों को बरकरार रखते हुए कोई दुष्प्रभाव नहीं होगा।
 * 2) मूल अपवाद सुरक्षा: विफल संचालन के आंशिक निष्पादन के परिणामस्वरूप दुष्प्रभाव हो सकते हैं, लेकिन सभी अपरिवर्तनीय (कंप्यूटर विज्ञान) संरक्षित हैं। किसी भी संग्रहीत डेटा में मान्य मान होंगे जो मूल मानों से भिन्न हो सकते हैं। संसाधन लीक (स्मृति रिसाव सहित) को आमतौर पर एक अपरिवर्तनीय बताते हुए खारिज कर दिया जाता है कि सभी संसाधनों का हिसाब और प्रबंधन किया जाता है।
 * 3) कोई अपवाद नहीं सुरक्षा: कोई गारंटी नहीं दी जाती है।

आमतौर पर, मजबूत कोड लिखने के लिए कम से कम बुनियादी अपवाद सुरक्षा की आवश्यकता होती है। सुरक्षा के उच्च स्तर को हासिल करना कभी-कभी मुश्किल हो सकता है, और अतिरिक्त नकल के कारण ओवरहेड हो सकता है। अपवाद सुरक्षा के लिए एक प्रमुख तंत्र है a  खंड, या इसी तरह के अपवाद हैंडलिंग सिंटैक्स, जो यह सुनिश्चित करते हैं कि अपवादों सहित ब्लॉक से बाहर निकलने पर निश्चित कोड हमेशा चलाया जाता है। कई भाषाओं ने ऐसे निर्माण किए हैं जो इसे सरल बनाते हैं, विशेष रूप से निपटान पैटर्न का उपयोग करते हुए, जिसे नाम दिया गया है ,  , या  -संसाधनों के साथ।

उदाहरण
एक स्मार्ट वेक्टर प्रकार पर विचार करें, जैसे C++'s या जावा का. जब कोई वस्तु एक वेक्टर में जोड़ा जाता है, वेक्टर को वास्तव में जोड़ना चाहिए  वस्तुओं की आंतरिक सूची में और एक गिनती फ़ील्ड को अपडेट करें जो बताती है कि कितनी वस्तुएं हैं. यदि मौजूदा क्षमता पर्याप्त नहीं है तो इसे नई मेमोरी आवंटित करने की भी आवश्यकता हो सकती है।

अपवाद सुरक्षा विकल्प: नो-थ्रो गारंटी: यह सुनिश्चित करके कार्यान्वित किया जाता है कि स्मृति आवंटन कभी विफल नहीं होता है, या इसे परिभाषित करके आवंटन विफलता पर फ़ंक्शन का व्यवहार (उदाहरण के लिए, फ़ंक्शन द्वारा एक बूलियन परिणाम लौटाने से संकेत मिलता है कि सम्मिलन हुआ है या नहीं)।
 * मजबूत अपवाद सुरक्षा: किसी भी आवश्यक आवंटन को पहले करके कार्यान्वित किया जाता है, और फिर कोई त्रुटि नहीं होने पर बफ़र्स की अदला-बदली की जाती है ( :wikibooks:More C++ Idioms/Copy-and-swap|copy-and-swap मुहावरा)। इस मामले में, या तो का सम्मिलन में  सफल होता है, या  आवंटन विफल होने के बावजूद अपरिवर्तित रहता है।
 * बुनियादी अपवाद सुरक्षा: यह सुनिश्चित करके कार्यान्वित किया जाता है कि गणना फ़ील्ड के अंतिम आकार को प्रतिबिंबित करने की गारंटी है . उदाहरण के लिए, यदि कोई त्रुटि सामने आती है, तो समारोह पूरी तरह से हटा सकता है  और इसकी गिनती फ़ील्ड को शून्य पर रीसेट करें। विफल होने पर, कोई संसाधन लीक नहीं होते हैं, लेकिन का पुराना मान संरक्षित नहीं है।
 * कोई अपवाद सुरक्षा नहीं: एक सम्मिलन विफलता से दूषित सामग्री हो सकती है, गिनती फ़ील्ड में गलत मान या संसाधन रिसाव।

बाहरी संबंध

 * Herb Sutter: Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions, 2000
 * Jon Kalb: Exception-Safe Coding in C++, with C++Now! 2012 presentations on exception safety.
 * Related discussion on Stackoverflow: C++: do you (really) write exception safe code