खुशी है कि आपने इसे एक प्रश्न के रूप में पोस्ट किया है। :)
मैं यह कहना चाह रहा था कि विध्वंसक और finally
वैचारिक रूप से भिन्न होते हैं:
- विध्वंसक संसाधन जारी करने के लिए हैं ( डेटा )
finally
कॉलर ( नियंत्रण ) पर लौटने के लिए है
इस काल्पनिक छद्म कोड पर विचार करें, कहें:
try {
bar();
} finally {
logfile.print("bar has exited...");
}
finally
यहां पूरी तरह से एक नियंत्रण समस्या का समाधान हो रहा है न कि संसाधन प्रबंधन की समस्या का।
विभिन्न कारणों से विध्वंसक में ऐसा करने का कोई मतलब नहीं होगा:
- कोई भी चीज़ "हासिल" या "निर्मित" नहीं की जा रही है
- लॉग फ़ाइल को मुद्रित करने के लिए विफलता होगा नहीं संसाधन लीक, डेटा भ्रष्टाचार, आदि (यह सोचते हैं कि यहाँ लॉगफ़ाइल कहीं और कार्यक्रम में वापस खिलाया नहीं है) में परिणाम
- यह
logfile.print
विफल होने के लिए वैध है , जबकि विनाश (वैचारिक रूप से) विफल नहीं हो सकता
यहाँ एक और उदाहरण है, इस बार की तरह जावास्क्रिप्ट में:
var mo_document = document, mo;
function observe(mutations) {
mo.disconnect(); // stop observing changes to prevent re-entrance
try {
/* modify stuff */
} finally {
mo.observe(mo_document); // continue observing (conceptually, this can fail)
}
}
mo = new MutationObserver(observe);
return observe();
उपरोक्त उदाहरण में, फिर से, जारी करने के लिए कोई संसाधन नहीं हैं।
वास्तव में, finally
ब्लॉक अपने लक्ष्य को प्राप्त करने के लिए आंतरिक रूप से संसाधनों का अधिग्रहण कर रहा है, जो संभावित रूप से विफल हो सकते हैं। इसलिए, एक विध्वंसक (यदि जावास्क्रिप्ट एक था) का उपयोग करने का कोई मतलब नहीं है।
दूसरी ओर, इस उदाहरण में:
b = get_data();
try {
a.write(b);
} finally {
free(b);
}
finally
एक संसाधन को नष्ट कर रहा है, b
। यह डेटा की समस्या है। समस्या स्पष्ट रूप से कॉलर पर नियंत्रण वापस करने के बारे में नहीं है, बल्कि संसाधन लीक से बचने के बारे में है।
विफलता एक विकल्प नहीं है, और (वैचारिक रूप से) कभी नहीं होना चाहिए।
हर रिलीज़ b
को जरूरी अधिग्रहण के साथ जोड़ा जाता है, और यह RAII का उपयोग करने के लिए समझ में आता है।
दूसरे शब्दों में, सिर्फ इसलिए कि आप या तो अनुकरण करने के लिए उपयोग कर सकते हैं इसका मतलब यह नहीं है कि दोनों एक और एक ही समस्या हैं या दोनों ही दोनों समस्याओं का उचित समाधान हैं।