अपवाद सुरक्षा: Difference between revisions
(→उदाहरण) |
(→उदाहरण) |
||
Line 34: | Line 34: | ||
यह सुनिश्चित करके कार्यान्वित किया जाता है कि स्मृति आवंटन कभी विफल नहीं होता है, या इसे परिभाषित करके <code>finally</code> आवंटन विफलता पर फ़ंक्शन का व्यवहार करती है। (उदाहरण के लिए, फ़ंक्शन द्वारा बूलियन लौटाने से संकेत मिलता है कि सम्मिलन हुआ है या नहीं इत्यादि)। | यह सुनिश्चित करके कार्यान्वित किया जाता है कि स्मृति आवंटन कभी विफल नहीं होता है, या इसे परिभाषित करके <code>finally</code> आवंटन विफलता पर फ़ंक्शन का व्यवहार करती है। (उदाहरण के लिए, फ़ंक्शन द्वारा बूलियन लौटाने से संकेत मिलता है कि सम्मिलन हुआ है या नहीं इत्यादि)। | ||
;मजबूत अपवाद सुरक्षा | ;मजबूत अपवाद सुरक्षा | ||
: किसी भी आवश्यक आवंटन को पहले करके कार्यान्वित किया जाता है और फिर कोई त्रुटि नहीं होने पर बफ़र्स का आदान प्रदान किया जाता है। ( विकीबुक्स:मोर | : किसी भी आवश्यक आवंटन को पहले करके कार्यान्वित किया जाता है और फिर कोई त्रुटि नहीं होने पर बफ़र्स का आदान प्रदान किया जाता है। ( विकीबुक्स:मोर C++/कॉपी-एंड-स्वैप मुहावरा)। इस स्थिति में, या तो {{Cpp|x}} का {{Cpp|v}} में सम्मिलन सफल होता है या आवंटन विफलता के अतिरिक्त {{Cpp|v}} अपरिवर्तित रहता है। | ||
;बुनियादी अपवाद सुरक्षा: यह सुनिश्चित करके कार्यान्वित किया गया है कि गणना क्षेत्र को {{Cpp|v}} के अंतिम आकार को प्रतिबिंबित करने की गारंटी होती है। उदाहरण के लिए, यदि कोई त्रुटि आती है, तो <code>finally</code> फ़ंक्शन पूरे प्रकार से {{Cpp|v}} को हटा सकता है और इसके गणना क्षेत्र को शून्य पर पुनः स्थापित कर सकता है। अतः विफल होने पर कोई संसाधन लीक नहीं होता है, परन्तु {{Cpp|v}} का पुराना मान संरक्षित नहीं होता है। | ;बुनियादी अपवाद सुरक्षा: यह सुनिश्चित करके कार्यान्वित किया गया है कि गणना क्षेत्र को {{Cpp|v}} के अंतिम आकार को प्रतिबिंबित करने की गारंटी होती है। उदाहरण के लिए, यदि कोई त्रुटि आती है, तो <code>finally</code> फ़ंक्शन पूरे प्रकार से {{Cpp|v}} को हटा सकता है और इसके गणना क्षेत्र को शून्य पर पुनः स्थापित कर सकता है। अतः विफल होने पर कोई संसाधन लीक नहीं होता है, परन्तु {{Cpp|v}} का पुराना मान संरक्षित नहीं होता है। | ||
;कोई अपवाद सुरक्षा नहीं: सम्मिलन विफलता {{Cpp|v}} में दूषित सामग्री, गणना क्षेत्र में गलत मान या संसाधन रिसाव का कारण बन सकती है। | ;कोई अपवाद सुरक्षा नहीं: सम्मिलन विफलता {{Cpp|v}} में दूषित सामग्री, गणना क्षेत्र में गलत मान या संसाधन रिसाव का कारण बन सकती है। |
Revision as of 12:30, 28 February 2023
अपवाद सुरक्षा कोड की वह स्थिति है जो अपवाद फेंके जाने पर सही प्रकार से कार्य करती है।[1] चूँकि अपवाद सुरक्षा सुनिश्चित करने में सहायता के लिए C++ मानक पुस्तकालय डेवलपर्स ने अपवाद सुरक्षा स्तरों का सेट तैयार किया जाता है, अतः अपवादों के संबंध में डेटा संरचना के संचालन के व्यवहार की संविदात्मक गारंटी पुस्तकालय और कार्यान्वयनकर्ता ग्राहक इन गारंटियों का उपयोग तब कर सकते हैं जब अपवाद हैंडलिंग शुद्धता के बारे में तर्क करते हैं। जिससे अपवाद सुरक्षा स्तर अन्य भाषाओं और त्रुटि प्रबंधन तंत्रों पर समान रूप से प्रयुक्त होते हैं।[2]
इतिहास
जैसा कि डेविड अब्राहम (कंप्यूटर प्रोग्रामर) लिखते हैं कि C++ के अपवाद होने से पूर्व किसी ने भी 'त्रुटि-सुरक्षा' की बात नहीं की थी।[3] सन् 1994 में ही यह शब्द आईएसओ / आईईसी जेटीसी1/एससी 22|जेटीसी1/एससी22/डब्लूजी21, सी++ मानक समिति में प्रकाशनों के विषय के रूप में प्रकट हुआ था।[4] अतः C++ मानक पुस्तकालय के लिए अपवाद सुरक्षा को प्रथम बार इब्राहीम द्वारा मानक टेम्पलेट लाइब्रेरी के लिए औपचारिक रूप से औपचारिक सुरक्षा / मजबूत सुरक्षा भेद स्थापित किया गया था।[5] इसके पश्चात् प्रस्ताव में आधुनिक बुनियादी / मजबूत / नोथ्रो गारंटियों तक बढ़ाया गया था।[6]
पृष्ठभूमि
समान्यतः अपवाद गैर-स्थानीय नियंत्रण प्रवाह का रूप प्रदान करते हैं, जिसमें अपवाद फ़ंक्शन से बबल हो सकता है। यह बबल परिवर्तनशील डेटा संरचना के अपरिवर्तनशीलताओं को निम्नानुसार नष्ट करके अपवाद सुरक्षा बग का कारण बन सकती है। Cite error: Closing </ref>
missing for <ref>
tag
- मूल अपवाद सुरक्षा: विफल संचालन के आंशिक निष्पादन के परिणामस्वरूप दुष्प्रभाव हो सकते हैं, किन्तु सभी अपरिवर्तनीय (कंप्यूटर विज्ञान) संरक्षित रहते हैं। चूँकि किसी भी संग्रहीत डेटा में मान्य मान उपस्थित होंगे जो मूल मानों से भिन्न हो सकते हैं। अतः संसाधन लीक (स्मृति रिसाव सहित) को सामान्यतः अपरिवर्तनीय बताते हुए अस्वीकार कर दिया जाता है कि सभी संसाधनों की गणना और प्रबंधन किया जाता है।
- कोई अपवाद नहीं सुरक्षा: कोई गारंटी नहीं दी जाती है।
सामान्यतः, मजबूत कोड लिखने के लिए कम से कम बुनियादी अपवाद सुरक्षा की आवश्यकता होती है। जिससे सुरक्षा के उच्च स्तर को प्राप्त करने में कभी-कभी कठिनाई हो सकती है और अतिरिक्त प्रतिलिपि के कारण ऊपर हो सकता है। चूँकि अपवाद सुरक्षा के लिए प्रमुख तंत्र finally
खंड, या इसी प्रकार के अपवाद हैंडलिंग सिंटैक्स है जो यह सुनिश्चित करते हैं कि अपवादों सहित ब्लॉक से बाहर निकलने पर निश्चित कोड हमेशा चलाया जाता है। अतः कई भाषाओं ने ऐसे निर्माण किए हैं जो इसे सरल बनाते हैं, विशेष रूप से निपटान पैटर्न का उपयोग करते हुए, जिसे using
, with
, या try
-संसाधनों के साथ नाम दिया गया है।
उदाहरण
स्मार्ट वेक्टर प्रकार पर विचार करें, जैसे C++ का std::vector
या जावा का ArrayList
. जब किसी वस्तु x
को वेक्टर v
में जोड़ा जाता है, तब वेक्टर को वास्तव में वस्तुओं की आंतरिक सूची में x
जोड़ना चाहिए और गणना क्षेत्र को आधुनिकतम बनाना चाहिए जो यह बताता है कि v
में कितनी वस्तुएं हैं। यदि उपस्थित क्षमता होने पर इसे नई मेमोरी आवंटित करने की भी आवश्यकता हो सकती है। यह पर्याप्त नहीं है।
अपवाद सुरक्षा विकल्प:
नो-थ्रो गारंटी
यह सुनिश्चित करके कार्यान्वित किया जाता है कि स्मृति आवंटन कभी विफल नहीं होता है, या इसे परिभाषित करके finally
आवंटन विफलता पर फ़ंक्शन का व्यवहार करती है। (उदाहरण के लिए, फ़ंक्शन द्वारा बूलियन लौटाने से संकेत मिलता है कि सम्मिलन हुआ है या नहीं इत्यादि)।
- मजबूत अपवाद सुरक्षा
- किसी भी आवश्यक आवंटन को पहले करके कार्यान्वित किया जाता है और फिर कोई त्रुटि नहीं होने पर बफ़र्स का आदान प्रदान किया जाता है। ( विकीबुक्स:मोर C++/कॉपी-एंड-स्वैप मुहावरा)। इस स्थिति में, या तो
x
काv
में सम्मिलन सफल होता है या आवंटन विफलता के अतिरिक्तv
अपरिवर्तित रहता है। - बुनियादी अपवाद सुरक्षा
- यह सुनिश्चित करके कार्यान्वित किया गया है कि गणना क्षेत्र को
v
के अंतिम आकार को प्रतिबिंबित करने की गारंटी होती है। उदाहरण के लिए, यदि कोई त्रुटि आती है, तोfinally
फ़ंक्शन पूरे प्रकार सेv
को हटा सकता है और इसके गणना क्षेत्र को शून्य पर पुनः स्थापित कर सकता है। अतः विफल होने पर कोई संसाधन लीक नहीं होता है, परन्तुv
का पुराना मान संरक्षित नहीं होता है। - कोई अपवाद सुरक्षा नहीं
- सम्मिलन विफलता
v
में दूषित सामग्री, गणना क्षेत्र में गलत मान या संसाधन रिसाव का कारण बन सकती है।
संदर्भ
- ↑ 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.
- ↑ Lau, Ron (10 November 2020). "Exception safety in JS world". Medium (in English).
- ↑ 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.
- ↑ Colvin, Gregory (1994). "Exception Safe Exceptions" (PDF). C++ Standards Committee Papers. Retrieved 17 December 2021.
- ↑ Abrahams, David. "STLport: Exception Handling". www.stlport.org. Retrieved 17 December 2021.
- ↑ Abrahams, Dave; Colvin, Greg. "Making the C++ Standard Library Exception Safe" (PDF). C++ Standards Committee Papers. Retrieved 17 December 2021.
Cite error: <ref>
tag with name "Stroustrup" defined in <references>
is not used in prior text.
बाहरी संबंध
- 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