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

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

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

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


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

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

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

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

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

अपवाद सुरक्षा विकल्प:

नो-थ्रो गारंटी

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


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

बाहरी संबंध

 * 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