मैं एक कंटेनर के लिए ड्रॉप-प्रतिस्थापन लिख रहा हूं, और मैं को सभी अपवाद-गारंटी प्राप्त करने की कोशिश कर रहा हूं। मैं वर्तमान में clear
विधि लिख रहा हूं, और मैं इसे जितना संभव हो सके पूरा करना चाहता हूं, और हमेशा एक स्थिर स्थिति में कंटेनर छोड़ने के लिए, भले ही विनाशकों में से एक अपवाद फेंक दें। मैं सफाई करने के बाद अपवाद के बिना अपवाद को भी पुनर्स्थापित करना चाहता हूं, अधिमानतः बिना स्लाइसिंग के।एक अपवाद वस्तु कब नष्ट हो जाती है (और इसे नियंत्रित किया जा सकता है)?
यह मुझे प्रश्न पर लाता है; एक अपवाद कब नष्ट किया गया है? आइए एक प्रयास को देखें: यह उदाहरण के लिए सरलीकृत है।
void container::clear()
{
bool had_exception = false;
std::exception* exp;
internal_set_empty(); // this cant throw
while(! internal_done())
{
try
{
internal_destruct_next(); // this might throw if T::~T() throws
}
catch(std::exception& e)
{
had_exception = true;
exp = &e;
}
}
if(had_exception)
throw *exp;
}
मैं इस, बुरी तरह विफल क्योंकि अपवाद शायद है विलुप्त जब यह संभाला माना जाता है की उम्मीद है, और इस तकनीकी रूप से rethrow नहीं करता है।
एक और प्रयास अपवाद की एक प्रतिलिपि लेगा, कुछ मुझे उम्मीद है कि टुकड़ा होगा।
क्या अपवाद के जीवनकाल को बढ़ाने का कोई तरीका है ताकि मैं बाद में को फिर से निकाल सकूं? यदि संभव हो, तो मैं catch(...)
के माध्यम से पकड़े गए अपवादों को फिर से भरने में सक्षम होना चाहूंगा।
http: // en।यदि आपका परिदृश्य काम कर सकता है तो cppreference.com/w/cpp/error/exception_ptr आसान हो सकता है। – Mat
@Mat 'upgrade_ptr' ठीक वैसे ही लगता है जो मैं खोज रहा था, लेकिन ऐसा लगता है कि एक और मौलिक समस्या है। – sp2danny