मुझे लगता है कि इस बारे में सोचने का सबसे अच्छा तरीका प्रोग्राम राज्य के मामले में है। आप प्रोग्राम स्थिति को नुकसान पहुंचाने के लिए असफल ऑपरेशन नहीं चाहते हैं। This paper "अपवाद सुरक्षा" की अवधारणा का वर्णन करता है।
सामान्यतः, आपको सबसे पहले यह तय करने की आवश्यकता होती है कि किसी फ़ंक्शन को अपवाद सुरक्षा की किस स्तर की गारंटी की आवश्यकता है। स्तरों
- बेसिक Guarnantee हैं
- मजबूत गारंटी
- NoThrow गारंटी
बुनियादी गारंटी का अर्थ है कि एक अपवाद या अन्य त्रुटि का सामना करने में, कोई संसाधन लीक कर रहे हैं, मजबूत गारंटी कहती है कि कार्यक्रम राज्य को अपवाद से पहले वापस ले जाया जाता है, और विधियों को कभी अपवाद नहीं फेंकते हैं।
जब मैं अप्रत्याशित, रनटाइम विफलता होती है तो मैं व्यक्तिगत रूप से अपवादों का उपयोग करता हूं। मेरे लिए अप्रत्याशित साधन है कि इस तरह की विफलता संचालन के सामान्य पाठ्यक्रम में नहीं होनी चाहिए। रनटाइम का अर्थ है कि त्रुटि मेरे नियंत्रण के बाहर कुछ बाहरी घटक की स्थिति के कारण है, क्योंकि मेरे हिस्से पर तर्क त्रुटियों के कारण। मैं तर्क त्रुटियों को पकड़ने के लिए ASSERT() का उपयोग करता हूं, और मैं अपेक्षित त्रुटियों के लिए बूलियन रिटर्न मानों का उपयोग करता हूं।
क्यों? एएसएसईआरटी को रिलीज कोड में संकलित नहीं किया गया है, इसलिए मैं अपने उपयोगकर्ताओं को अपने स्वयं के असफलताओं की त्रुटि जांच के साथ बोझ नहीं डालता हूं। यही यूनिट परीक्षण और सहायक हैं। बूलियन क्योंकि अपवाद फेंकना गलत संदेश दे सकता है। अपवाद भी महंगा हो सकता है। अगर मैं आवेदन निष्पादन के सामान्य पाठ्यक्रम में अपवाद फेंकता हूं, तो मैं एमएस विजुअल स्टूडियो डीबगर के उत्कृष्ट "कैच ऑन फेंक" अपवाद सुविधा का उपयोग नहीं कर सकता, जहां मैं इस बिंदु पर एक प्रोग्राम को डीबगर तोड़ सकता हूं कि कोई अपवाद है केवल अनचाहे (क्रैशिंग) अपवादों पर रोक लगाने के डिफ़ॉल्ट के बजाय फेंक दिया गया।
मूल गारंटी के लिए सी ++ तकनीक देखने के लिए, Google "RAII" (संसाधन अधिग्रहण प्रारंभिक है)। यह एक तकनीक है जहां आप किसी ऑब्जेक्ट में संसाधन को लपेटते हैं जिसका कन्स्ट्रक्टर संसाधन आवंटित करता है और जो विनाशक संसाधन को मुक्त करता है। चूंकि सी ++ अपवाद स्टैक को खोलते हैं, इसलिए यह गारंटी देता है कि अपवादों के सामने संसाधन मुक्त हो जाते हैं। आप इस तकनीक का उपयोग अपवाद के सामने कार्यक्रम स्थिति को वापस रोल करने के लिए कर सकते हैं। किसी ऑब्जेक्ट में बस "Commit" विधि जोड़ें, और यदि कोई वस्तु नष्ट होने से पहले प्रतिबद्ध नहीं है, तो "रोलबैक" ऑपरेशन चलाएं जो विनाशक में प्रोग्राम स्थिति को पुनर्स्थापित करता है।
स्रोत
2010-01-22 19:24:35
+1: और, एक अपवाद केवल तभी संभाला जा सकता है जब किसी फ़ंक्शन में कुछ करने के लिए वैकल्पिक रणनीतियां हों। –
मुझे लगता है कि प्रारंभिक फेंक से अधिक संदर्भ के साथ उपयोगी लॉगिंग उत्पन्न करने के लिए अपवाद को पकड़ना, कभी-कभी उपयोगी हो सकता है। उसके बाद, अगर आप अपवाद को संभाल नहीं सकते हैं तो इसे फिर से करें। – extraneon
"अधिक जानकारी के साथ" कुंजी है। बिना किसी अतिरिक्त जानकारी के लॉगिंग, उच्च स्तर तक प्रतीक्षा करनी चाहिए। –