अपवाद सुरक्षा: Difference between revisions

From Vigyanwiki
(Created page with "{{Short description|State of code working correctly when exceptions are thrown}} अपवाद सुरक्षा अपवाद फेंके जाने पर स...")
 
No edit summary
 
(11 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{Short description|State of code working correctly when exceptions are thrown}}
{{Short description|State of code working correctly when exceptions are thrown}}
अपवाद सुरक्षा अपवाद फेंके जाने पर सही ढंग से काम करने वाले कोड की स्थिति है।<ref>{{cite web |last1=Crichton|first1=Alex |title=Rust RFC: Stabilize catch_panic |url=https://github.com/rust-lang/rfcs/blob/master/text/1236-stabilize-catch-panic.md#background-what-is-exception-safety |publisher=The Rust Programming Language |access-date=26 May 2022 |date=24 July 2015|quote=Code is exception safe if it works correctly even when the functions it calls into throw exceptions.}}</ref> अपवाद सुरक्षा सुनिश्चित करने में सहायता के लिए, [[सी ++]] मानक पुस्तकालय डेवलपर्स ने अपवाद सुरक्षा स्तरों का एक सेट तैयार किया है, अपवादों के संबंध में डेटा संरचना के संचालन के व्यवहार की संविदात्मक गारंटी। पुस्तकालय कार्यान्वयनकर्ता और ग्राहक इन गारंटियों का उपयोग तब कर सकते हैं जब अपवाद हैंडलिंग शुद्धता के बारे में तर्क करते हैं। अपवाद सुरक्षा स्तर अन्य भाषाओं और त्रुटि प्रबंधन तंत्रों पर समान रूप से लागू होते हैं।<ref>{{cite web |last1=Lau |first1=Ron |title=Exception safety in JS world |url=https://medium.com/@ronlauhk01/exception-safety-in-js-world-7f1e980c409b |website=Medium |language=en |date=10 November 2020}}</ref>
'''अपवाद सुरक्षा''' कोड की वह स्थिति है जो अपवाद फेंके जाने पर सही प्रकार से कार्य करती है।<ref>{{cite web |last1=Crichton|first1=Alex |title=Rust RFC: Stabilize catch_panic |url=https://github.com/rust-lang/rfcs/blob/master/text/1236-stabilize-catch-panic.md#background-what-is-exception-safety |publisher=The Rust Programming Language |access-date=26 May 2022 |date=24 July 2015|quote=Code is exception safe if it works correctly even when the functions it calls into throw exceptions.}}</ref> चूँकि अपवाद सुरक्षा सुनिश्चित करने में सहायता के लिए [[सी ++|C++]] मानक पुस्तकालय डेवलपर्स ने अपवाद सुरक्षा स्तरों का सेट तैयार किया जाता है, अतः अपवादों के संबंध में डेटा संरचना के संचालन के व्यवहार की संविदात्मक गारंटी पुस्तकालय और कार्यान्वयनकर्ता ग्राहक इन गारंटियों का उपयोग तब कर सकते हैं जब अपवाद हैंडलिंग शुद्धता के बारे में तर्क करते हैं। जिससे अपवाद सुरक्षा स्तर अन्य भाषाओं और त्रुटि प्रबंधन तंत्रों पर समान रूप से प्रयुक्त होते हैं।<ref>{{cite web |last1=Lau |first1=Ron |title=Exception safety in JS world |url=https://medium.com/@ronlauhk01/exception-safety-in-js-world-7f1e980c409b |website=Medium |language=en |date=10 November 2020}}</ref>
 
 
== इतिहास ==
== इतिहास ==


जैसा कि डेविड अब्राहम (कंप्यूटर प्रोग्रामर) लिखते हैं, C ++ के अपवाद होने से पहले किसी ने भी 'त्रुटि-सुरक्षा' की बात नहीं की थी।<ref name="esg"/> 1994 में ही यह शब्द ISO/IEC JTC 1/SC 22|JTC1/SC22/WG21, C++ मानक समिति में प्रकाशनों के विषय के रूप में प्रकट हुआ।<ref>{{cite web |last1=Colvin |first1=Gregory |title=Exception Safe Exceptions |url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1994/N0553.pdf |website=C++ Standards Committee Papers |access-date=17 December 2021 |date=1994}}</ref> सी ++ मानक पुस्तकालय के लिए अपवाद सुरक्षा को पहली बार इब्राहीम द्वारा [[मानक टेम्पलेट लाइब्रेरी]] के लिए औपचारिक रूप से औपचारिक सुरक्षा/मजबूत सुरक्षा भेद स्थापित किया गया था।<ref>{{cite web |last1=Abrahams |first1=David |title=STLport: Exception Handling |url=http://www.stlport.org/doc/exception_safety.html |website=www.stlport.org |access-date=17 December 2021}}</ref> इसे बाद के प्रस्ताव में आधुनिक बुनियादी/मजबूत/नोथ्रो गारंटियों तक बढ़ाया गया था।<ref>{{cite web |last1=Abrahams |first1=Dave |last2=Colvin |first2=Greg |title=Making the C++ Standard Library Exception Safe |url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1997/N1086.pdf |publisher=C++ Standards Committee Papers |access-date=17 December 2021}}</ref>
जैसा कि डेविड अब्राहम (कंप्यूटर प्रोग्रामर) लिखते हैं कि C++ के अपवाद होने से पूर्व किसी ने भी 'त्रुटि-सुरक्षा' की बात नहीं की थी।<ref name="esg"/> सन् 1994 में ही यह शब्द आईएसओ / आईईसी जेटीसी1/एससी 22|जेटीसी1/एससी22/डब्लूजी21, सी++ मानक समिति में प्रकाशनों के विषय के रूप में प्रकट हुआ था।<ref>{{cite web |last1=Colvin |first1=Gregory |title=Exception Safe Exceptions |url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1994/N0553.pdf |website=C++ Standards Committee Papers |access-date=17 December 2021 |date=1994}}</ref> अतः C++ मानक पुस्तकालय के लिए अपवाद सुरक्षा को प्रथम बार इब्राहीम द्वारा [[मानक टेम्पलेट लाइब्रेरी]] के लिए औपचारिक रूप से औपचारिक सुरक्षा / मजबूत सुरक्षा भेद स्थापित किया गया था।<ref>{{cite web |last1=Abrahams |first1=David |title=STLport: Exception Handling |url=http://www.stlport.org/doc/exception_safety.html |website=www.stlport.org |access-date=17 December 2021}}</ref> इसके पश्चात् प्रस्ताव में आधुनिक बुनियादी / मजबूत / नोथ्रो गारंटियों तक बढ़ाया गया था।<ref>{{cite web |last1=Abrahams |first1=Dave |last2=Colvin |first2=Greg |title=Making the C++ Standard Library Exception Safe |url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1997/N1086.pdf |publisher=C++ Standards Committee Papers |access-date=17 December 2021}}</ref>
 
 
== पृष्ठभूमि ==
== पृष्ठभूमि ==


अपवाद गैर-स्थानीय नियंत्रण प्रवाह का एक रूप प्रदान करते हैं, जिसमें एक अपवाद एक फ़ंक्शन से बुलबुला हो सकता है। यह बुदबुदाहट एक परिवर्तनशील डेटा संरचना के इनवेरिएंट्स को निम्नानुसार तोड़कर एक अपवाद सुरक्षा बग का कारण बन सकती है:<ref name=Rust_catch>{{cite web |last1=Crichton|first1=Alex |title=रस्ट RFC: कैच_पैनिक को स्थिर करें|url=https://github.com/rust-lang/rfcs/blob/master/text/1236-stabilize-catch-panic.md#background-what-is-exception-safety |publisher=The Rust Programming Language |access-date=26 May 2022 |date=24 July 2015}}</रेफरी>
समान्यतः अपवाद गैर-स्थानीय नियंत्रण प्रवाह का रूप प्रदान करते हैं, जिसमें अपवाद फ़ंक्शन से बबल हो सकता है। यह बबल परिवर्तनशील डेटा संरचना के अपरिवर्तनशीलताओं को निम्नानुसार नष्ट करके अपवाद सुरक्षा बग का कारण बन सकती है। <ref name=Rust_catch>{{cite web |last1=Crichton|first1=Alex |title=रस्ट RFC: कैच_पैनिक को स्थिर करें|url=https://github.com/rust-lang/rfcs/blob/master/text/1236-stabilize-catch-panic.md#background-what-is-exception-safety |publisher=The Rust Programming Language |access-date=26 May 2022 |date=24 July 2015}}</ref>


# एक परिवर्तनशील डेटा संरचना पर एक ऑपरेशन का एक चरण डेटा को संशोधित करता है और एक अपरिवर्तनीय को तोड़ता है।
# एक परिवर्तनशील डेटा संरचना पर एक ऑपरेशन का एक चरण डेटा को संशोधित करता है और एक अपरिवर्तनीय को तोड़ता है।
Line 22: Line 18:
== वर्गीकरण ==
== वर्गीकरण ==


[[सी ++ मानक पुस्तकालय]] अपवाद सुरक्षा के कई स्तर प्रदान करता है (सुरक्षा के घटते क्रम में):<ref name="Stroustrup"/># नो-थ्रो गारंटी, जिसे विफलता पारदर्शिता के रूप में भी जाना जाता है: असाधारण स्थितियों में भी संचालन सफल होने और सभी आवश्यकताओं को पूरा करने की गारंटी है। यदि कोई अपवाद होता है, तो इसे आंतरिक रूप से नियंत्रित किया जाएगा और ग्राहकों द्वारा इसका अवलोकन नहीं किया जाएगा।
[[सी ++ मानक पुस्तकालय]] अपवाद सुरक्षा के कई स्तर प्रदान करता है (सुरक्षा के घटते क्रम में):<ref name="Stroustrup"/>
# नो-थ्रो गारंटी, जिसे विफलता पारदर्शिता के रूप में भी जाना जाता है: असाधारण स्थितियों में भी संचालन सफल होने और सभी आवश्यकताओं को पूरा करने की गारंटी है। यदि कोई अपवाद होता है, तो इसे आंतरिक रूप से नियंत्रित किया जाएगा और ग्राहकों द्वारा इसका अवलोकन नहीं किया जाएगा।
# मजबूत अपवाद सुरक्षा, जिसे कमिट या रोलबैक शब्दार्थ के रूप में भी जाना जाता है: संचालन विफल हो सकता है, लेकिन विफल संचालन की गारंटी है कि मूल मूल्यों को बरकरार रखते हुए कोई दुष्प्रभाव नहीं होगा।<ref>{{cite web |last1=Austern |first1=Matt |title=Standard Library Exception Policy|publisher=C++ Standards Committee Papers|date=30 May 1997|url=https://www.open-std.org/jtc1/sc22/wg21/docs/papers/1997/N1077.asc |access-date=26 May 2022}}</ref>
# मजबूत अपवाद सुरक्षा, जिसे कमिट या रोलबैक शब्दार्थ के रूप में भी जाना जाता है: संचालन विफल हो सकता है, लेकिन विफल संचालन की गारंटी है कि मूल मूल्यों को बरकरार रखते हुए कोई दुष्प्रभाव नहीं होगा।<ref>{{cite web |last1=Austern |first1=Matt |title=Standard Library Exception Policy|publisher=C++ Standards Committee Papers|date=30 May 1997|url=https://www.open-std.org/jtc1/sc22/wg21/docs/papers/1997/N1077.asc |access-date=26 May 2022}}</ref>
# मूल अपवाद सुरक्षा: विफल संचालन के आंशिक निष्पादन के परिणामस्वरूप दुष्प्रभाव हो सकते हैं, लेकिन सभी [[अपरिवर्तनीय (कंप्यूटर विज्ञान)]] संरक्षित हैं। किसी भी संग्रहीत डेटा में मान्य मान होंगे जो मूल मानों से भिन्न हो सकते हैं। संसाधन लीक ([[स्मृति रिसाव]] सहित) को आमतौर पर एक अपरिवर्तनीय बताते हुए खारिज कर दिया जाता है कि सभी संसाधनों का हिसाब और प्रबंधन किया जाता है।
# मूल अपवाद सुरक्षा: विफल संचालन के आंशिक निष्पादन के परिणामस्वरूप दुष्प्रभाव हो सकते हैं, किन्तु सभी [[अपरिवर्तनीय (कंप्यूटर विज्ञान)]] संरक्षित रहते हैं। चूँकि किसी भी संग्रहीत डेटा में मान्य मान उपस्थित होंगे जो मूल मानों से भिन्न हो सकते हैं। अतः संसाधन लीक ([[स्मृति रिसाव]] सहित) को सामान्यतः अपरिवर्तनीय बताते हुए अस्वीकार कर दिया जाता है कि सभी संसाधनों की गणना और प्रबंधन किया जाता है।
# कोई अपवाद नहीं सुरक्षा: कोई गारंटी नहीं दी जाती है।
# कोई अपवाद नहीं सुरक्षा: कोई गारंटी नहीं दी जाती है।


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


== उदाहरण ==
== उदाहरण ==
एक स्मार्ट वेक्टर प्रकार पर विचार करें, जैसे C++'s {{Cpp|std::vector}} या जावा का {{Cpp|ArrayList}}. जब कोई वस्तु {{Cpp|x}} एक वेक्टर में जोड़ा जाता है {{Cpp|v}}, वेक्टर को वास्तव में जोड़ना चाहिए {{Cpp|x}} वस्तुओं की आंतरिक सूची में और एक गिनती फ़ील्ड को अपडेट करें जो बताती है कि कितनी वस्तुएं हैं {{Cpp|v}}. यदि मौजूदा क्षमता पर्याप्त नहीं है तो इसे नई मेमोरी आवंटित करने की भी आवश्यकता हो सकती है।
स्मार्ट वेक्टर प्रकार पर विचार करें, जैसे C++ का {{Cpp|std::vector}} या जावा का {{Cpp|ArrayList}}. जब किसी वस्तु {{Cpp|x}} को वेक्टर {{Cpp|v}} में जोड़ा जाता है, तब वेक्टर को वास्तव में वस्तुओं की आंतरिक सूची में {{Cpp|x}} जोड़ना चाहिए और गणना क्षेत्र को आधुनिकतम बनाना चाहिए जो यह बताता है कि {{Cpp|v}} में कितनी वस्तुएं हैं। यदि उपस्थित क्षमता होने पर इसे नई मेमोरी आवंटित करने की भी आवश्यकता हो सकती है। यह पर्याप्त नहीं है। 


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


== संदर्भ ==
== संदर्भ ==
Line 44: Line 56:
<ref name="Stroustrup">{{cite book |author=Bjarne Stroustrup |author-link=Bjarne Stroustrup |title=Appendix E: Standard-Library Exception Safety in "The C++ Programming Language" |year=1997 |edition=3rd |publisher=Addison-Wesley |isbn=0-201-88954-4|url=https://www.stroustrup.com/3rd_safe.pdf}}</ref>
<ref name="Stroustrup">{{cite book |author=Bjarne Stroustrup |author-link=Bjarne Stroustrup |title=Appendix E: Standard-Library Exception Safety in "The C++ Programming Language" |year=1997 |edition=3rd |publisher=Addison-Wesley |isbn=0-201-88954-4|url=https://www.stroustrup.com/3rd_safe.pdf}}</ref>
</references>
</references>


== बाहरी संबंध ==
== बाहरी संबंध ==
Line 50: Line 61:
* Jon Kalb: [http://exceptionsafecode.com/ Exception-Safe Coding in C++], with C++Now! 2012 presentations on exception safety.
* Jon Kalb: [http://exceptionsafecode.com/ Exception-Safe Coding in C++], with C++Now! 2012 presentations on exception safety.
* Related discussion on Stackoverflow: [https://stackoverflow.com/questions/1853243/c-do-you-really-write-exception-safe-code C++: do you (really) write exception safe code]
* Related discussion on Stackoverflow: [https://stackoverflow.com/questions/1853243/c-do-you-really-write-exception-safe-code C++: do you (really) write exception safe code]
[[Category: सी ++]] [[Category: बहाव को काबू करें]] [[Category: प्रोग्रामिंग भाषा विषय]]


[[Category: Machine Translated Page]]
[[Category:CS1 English-language sources (en)]]
[[Category:Created On 19/02/2023]]
[[Category:Created On 19/02/2023]]
[[Category:Lua-based templates]]
[[Category:Machine Translated Page]]
[[Category:Pages with reference errors]]
[[Category:Pages with script errors|Short description/doc]]
[[Category:Short description with empty Wikidata description]]
[[Category:Template documentation pages|Short description/doc]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that generate short descriptions]]
[[Category:Templates using TemplateData]]

Latest revision as of 17:29, 3 March 2023

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

इतिहास

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

पृष्ठभूमि

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

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

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


वर्गीकरण

सी ++ मानक पुस्तकालय अपवाद सुरक्षा के कई स्तर प्रदान करता है (सुरक्षा के घटते क्रम में):[8]

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

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







उदाहरण

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

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

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

यह सुनिश्चित करके कार्यान्वित किया जाता है कि स्मृति आवंटन कभी विफल नहीं होता है, या इसे परिभाषित करके finally आवंटन विफलता पर फ़ंक्शन का व्यवहार करती है। (उदाहरण के लिए, फ़ंक्शन द्वारा बूलियन लौटाने से संकेत मिलता है कि सम्मिलन हुआ है या नहीं इत्यादि)।

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

संदर्भ

  1. Crichton, Alex (24 July 2015). "Rust RFC: Stabilize catch_panic". The Rust Programming Language. Retrieved 26 May 2022. Code is exception safe if it works correctly even when the functions it calls into throw exceptions.
  2. Lau, Ron (10 November 2020). "Exception safety in JS world". Medium (in English).
  3. Dave Abrahams (2000). Exception-Safety in Generic Components. Generic Programming. Lecture Notes in Computer Science. Vol. 1766. Springer. pp. 69–79. doi:10.1007/3-540-39953-4_6. ISBN 978-3-540-41090-4. Retrieved 2008-08-29.
  4. Colvin, Gregory (1994). "Exception Safe Exceptions" (PDF). C++ Standards Committee Papers. Retrieved 17 December 2021.
  5. Abrahams, David. "STLport: Exception Handling". www.stlport.org. Retrieved 17 December 2021.
  6. Abrahams, Dave; Colvin, Greg. "Making the C++ Standard Library Exception Safe" (PDF). C++ Standards Committee Papers. Retrieved 17 December 2021.
  7. 7.0 7.1 Crichton, Alex (24 July 2015). "रस्ट RFC: कैच_पैनिक को स्थिर करें". The Rust Programming Language. Retrieved 26 May 2022.
  8. Bjarne Stroustrup (1997). Appendix E: Standard-Library Exception Safety in "The C++ Programming Language" (PDF) (3rd ed.). Addison-Wesley. ISBN 0-201-88954-4.
  9. Austern, Matt (30 May 1997). "Standard Library Exception Policy". C++ Standards Committee Papers. Retrieved 26 May 2022.

बाहरी संबंध