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