2009-01-19 5 views
6

मैंने कुछ सी ++ कक्षाओं को एक विध्वंसक के साथ निम्नानुसार परिभाषित किया है:क्या मुझे अपने सी ++ विनाशकों के लिए घोषणाओं में फेंक() जोड़ना चाहिए?

class someClass 
{ 
    public: 
     someClass(); 
     ~someClass() throw(); 
}; 

क्या यह एक अच्छा विचार है?

मुझे अच्छी तरह पता है कि विनाशकों को कभी अपवाद नहीं फेंकना चाहिए, लेकिन क्या यह वास्तव में मुझे मेरे विनाशकों में अपवाद फेंकने से रोक देगा? मुझे 100% यकीन नहीं है कि यह गारंटी देता है।

संदर्भ: this recent question

उत्तर

7

यह आपको अपने विनाशक से अपवाद फेंकने से नहीं रोकता है। कंपाइलर अभी भी आपको ऐसा करने देगा। अंतर यह है कि यदि आप उस विनाशक से बचने के लिए अपवाद की अनुमति देते हैं, तो आपका प्रोग्राम तुरंत unexpected पर कॉल करेगा। वह फ़ंक्शन जो भी unexpected_handler अंक पर कॉल करता है, जो डिफ़ॉल्ट रूप से terminate है। तो जब तक कि आप एक अप्रत्याशित अपवाद को संभालने के लिए कुछ नहीं करते हैं, तो आपका प्रोग्राम समाप्त हो जाता है, जो पूरी तरह से एक बुरा विचार नहीं है। आखिरकार, अगर अपवाद वास्तव में अप्रत्याशित है, तो वास्तव में ऐसा कुछ भी नहीं है जो आपका प्रोग्राम इसे किसी भी तरह से संभालने में सक्षम होगा।

यह विनाशकों के बारे में कुछ खास नहीं है; सभी नियमों के लिए अपवाद विनिर्देशों पर एक ही नियम लागू होते हैं।

3

यह एक भयानक विचार नहीं है। यदि आप डिटोर में फेंकते हैं, जबकि कोई अपवाद प्रचारित नहीं किया जाता है, तो आप तत्काल निरस्त हो जाएंगे जो आपको बताएगा कि आप वास्तविक गैर-फेंकने वाले डॉटोर को भूल गए हैं।

यदि दूसरी तरफ आप फेंकने के बाहर निकलते हैं, तो आपको केवल एक अपवाद है, वास्तव में फेंक दिया गया है, तो आप केवल अपने खराब dtor कार्यान्वयन के बारे में जानेंगे।

संबंधित मुद्दे