कृपया निम्न अपवाद फेंकने पर एक नज़र डालें और पकड़ने:खतरनाक संदर्भ द्वारा अपवाद को पकड़ रहा है?
void some_function() {
throw std::exception("some error message");
}
int main(int argc, char **argv) {
try {
some_function();
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
exit(1);
}
return 0;
}
यह संदर्भ द्वारा फेंका अपवाद को पकड़ने के लिए सुरक्षित है?
मेरी चिंता का विषय है क्योंकि अपवाद e
वास्तव में ढेर some_function()
की पर रखा गया है। लेकिन some_function()
अभी वापस आ गया है, जिससे e
को नष्ट किया जा सकता है। तो वास्तव में अब एक विनाशकारी वस्तु के लिए e
अंक।
क्या मेरी चिंता सही है?
अपवाद को मूल्य के बिना कॉपी किए बिना सही तरीका क्या है? क्या मुझे new std::exception()
फेंकना चाहिए ताकि इसे गतिशील स्मृति में रखा जा सके?
ध्यान दें कि std :: अपवाद के लिए स्ट्रिंग कंस्ट्रक्टर मानक नहीं है, यह एक एमएस (अनुरूप?) एक्सटेंशन है। http://stackoverflow.com/questions/5157206/why-does-stdexception-have-extra-constructors-in-vc – Sigismondo
तो आप अपवाद को संदेश कैसे असाइन कर सकते हैं, इसलिए इसे 'what() 'का उपयोग करके मुद्रित किया जाता है? – SomethingSomething
@ कुछ ऐसा जो आप 'std :: अपवाद 'के व्युत्पन्न का उपयोग करेंगे जो कि निर्माता को संदेश पास करने की अनुमति देता है। उदाहरण के लिए 'std :: runtime_error'। और उपप्रकार फेंकने का सम्मेलन बिल्कुल कारण है कि आपको (कॉन्स) संदर्भ क्यों पकड़ना चाहिए। – user2079303