मैंने अपवाद की स्लाइसिंग के कारण हमारे कोड में एक बहुत ही सूक्ष्म बग तय कर दी है, और अब मैं यह सुनिश्चित करना चाहता हूं कि मैं समझ रहा हूं कि वास्तव में क्या हो रहा था। एक व्युत्पन्न के बजाय,अपवाद स्लाइसिंग - क्या यह जेनरेट प्रतिलिपि बनाने के कारण है?
class Exception
{
public:
// construction
Exception(int code, const char* format="", ...);
virtual ~Exception(void);
<snip - get/set routines and print function>
protected:
private:
int mCode; // thrower sets this
char mMessage[Exception::MessageLen]; // thrower says this FIXME: use String
};
class Derived : public Exception {
public:
Derived (const char* throwerSays) : Exception(1, throwerSays) {};
};
void innercall {
<do stuff>
throw Derived("Bad things happened!");
}
void outercall {
try {
innercall();
}
catch(Exception& e)
{
printf("Exception seen here! %s %d\n", __FILE__, __LINE__);
throw e;
}
}
बग पाठ्यक्रम कि outercall समाप्त होता है एक अपवाद फेंकने की थी:
यहाँ हमारे आधार अपवाद वर्ग, एक व्युत्पन्न वर्ग, और प्रासंगिक कार्यों है। मेरी बग व्युत्पन्न विफलता को पकड़ने के लिए कॉल स्टैक प्रयासों में उच्च से अधिक परिणामस्वरूप हुई।
अब, मैं बस यह सुनिश्चित करना चाहता हूं कि मैं समझूं - मुझे विश्वास है कि 'फेंक ई' लाइन पर, एक डिफ़ॉल्ट प्रतिलिपि कन्स्ट्रक्टर का उपयोग करके एक नई अपवाद वस्तु बनाई जा रही है। क्या यह वास्तव में चल रहा है?
यदि हां, तो क्या मुझे उन वस्तुओं के लिए कॉपी कन्स्ट्रक्टर लॉक करने की अनुमति है जिन्हें फेंक दिया जाएगा? मैं वास्तव में यह फिर से नहीं करना पसंद करूंगा, और हमारे कोड के पास अपवाद वस्तुओं की प्रतिलिपि बनाने का कोई कारण नहीं है (जिसे मैं जानता हूं)।
कृपया, इस तथ्य पर कोई टिप्पणी नहीं कि हमारे पास अपना अपवाद पदानुक्रम है। यह एक पुराना डिजाइन है जिसे मैं सही करने के लिए काम कर रहा हूं (मैं अच्छी प्रगति कर रहा हूं। मुझे घर से उगाई जाने वाली स्ट्रिंग क्लास, और घर के कई कंटेनर से छुटकारा मिल गया है।)
अद्यतन: स्पष्ट होने के लिए, मैंने कभी सवाल पूछने से पहले बग तय किया था ('फेंक ई' को 'फेंक' में बदलकर)। मैं सिर्फ यह देखने की पुष्टि कर रहा था कि क्या हो रहा था।
मुझे पता है कि आपने अन्य सामानों के बारे में चिंता न करने के लिए कहा है, लेकिन केवल दो अन्य चीजें हैं: अपनी 'अपवाद' वर्ग को 'std :: अपवाद' से प्राप्त करें और 'const &' द्वारा चीजें पकड़ें। – GManNickG
कॉन्स के रूप में पकड़ने का क्या फायदा है? मैं हमेशा संदर्भ से पकड़ता हूं, लेकिन क्यों? (ऐसा नहीं है कि मैं इस समय इस कक्षा के साथ ऐसा कर सकता हूं, लेकिन एक दिन ...) –
@ कोहेन: इस सेटिंग में स्थिरता का लाभ किसी भी अन्य सेटिंग में समान है - आप स्पष्ट रूप से उस इरादे को निर्दिष्ट करते हैं जिसे आप ' टी ऑब्जेक्ट की स्थिति को बदलने का इरादा रखता है और यह कि संकलक को यह सुनिश्चित करना चाहिए कि आप नहीं करते हैं - यह मानना है कि अपरिवर्तनीय वस्तुओं के कारण विचार करना आसान है (यानी डिबग, परीक्षण, कोड सही साबित करें) क्योंकि वे संदर्भित रूप से लिखने में मदद करते हैं पारदर्शी कोड –