2011-12-12 21 views
19

मानक के पास किसी अपवाद के बारे में कुछ कहना है जो संदर्भ द्वारा पकड़ा गया है और इसे संशोधित करने के प्रयासों के साथ क्या होता है?यदि आप संदर्भ द्वारा अपवाद पकड़ते हैं, तो क्या आप इसे संशोधित कर सकते हैं और पुनर्स्थापित कर सकते हैं?

निम्नलिखित कोड पर विचार करें:

class my_exception: public std::logic_error 
{ 
public: 
    std::vector<std::string> callstack; 
}; 

void MyFunc() 
{ 
    try 
    { 
     SomethingThatThrows(); 
    } 
    catch (my_exception & e) 
    { 
     e.callstack.push_back("MyFunc"); 
     throw; 
    } 
} 

यह एक काल्पनिक उदाहरण है, मैं वास्तव में कुछ इस तरह नहीं प्रयास कर रहा हूँ। मैं सिर्फ उत्सुक था कि क्या होगा, दूसरे धागे में सुझाव के आधार पर अपवादों को कॉन्स संदर्भ द्वारा पकड़ा जाना चाहिए।

+1

बढ़ावा :: अपवाद इस के लिए कुछ साफ टूल होते हैं। –

+1

push_back फेंक सकता है। स्ट्रिंग के कन्स्ट्रक्टर की प्रतिलिपि फेंक सकते हैं। आज मैं एक std :: सरणी अपवाद के अंदर what_msg पसंद करेंगे। ताकि आप वर्चुअल को आसानी से कार्यान्वित कर सकें। – Muxecoid

उत्तर

20

अपवाद बदल जाएगा।

§15.3 [except.handle]/17:

हैंडलर एक गैर निरंतर वस्तु वाणी है, उस वस्तु में कोई परिवर्तन अस्थायी उद्देश्य यह है कि फेंक के निष्पादन के द्वारा प्रारंभ किया गया था को प्रभावित नहीं करेगा -expression।

हैंडलर एक गैर निरंतर वस्तु के लिए एक संदर्भ वाणी है, संदर्भित वस्तु में कोई भी परिवर्तन जब फेंक अभिव्यक्ति मार डाला गया था और उस वस्तु rethrown किया जाना चाहिए प्रभाव पड़ेगा प्रारंभ अस्थायी वस्तु में परिवर्तन कर रहे हैं।

तो अगर my_exceptionMyFunc के बाहर पकड़ा जाता है, तो हम callstack में "MyFunc" प्रविष्टि दिखाई देगी (जैसे http://ideone.com/5ytqN)

10

हाँ, आप यह कर सकते हैं।

जब आप throw; का उपयोग करके वर्तमान अपवाद को पुनर्स्थापित करते हैं, तो कोई प्रतियां नहीं बनाई जाती हैं: मूल अस्थायी अपवाद ऑब्जेक्ट को पुनर्स्थापित किया जाता है। इस प्रकार, हैंडलर में उस ऑब्जेक्ट में किए गए कोई भी परिवर्तन अपवाद ऑब्जेक्ट में उपस्थित होंगे जब आप इसे अगली बार पकड़ लेंगे।

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

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