हालांकि यह प्रश्न पुराना है और पहले से ही बहुत उत्तर दिया गया है, मैं सिर्फ C ++ 11 में उचित अपवाद से निपटने के बारे में एक नोट जोड़ना चाहता हूं, क्योंकि मैं अपवादों के बारे में चर्चा में लगातार इसे याद कर रहा हूं:
यह StackOverflow पर यहाँ और यहाँ वर्णित है , कि कैसे आप एक डिबगर या बोझिल लॉगिंग की आवश्यकता के बिना अपने कोड के अंदर अपने अपवादों पर एक बैकट्रेस प्राप्त कर सकते हैं , बस एक उचित अपवाद हैंडलर लिखकर जो अपवादों को हटा देगा।
चूंकि आप इसे किसी भी व्युत्पन्न अपवाद वर्ग के साथ कर सकते हैं, इसलिए आप इस तरह के बैकट्रेस में बहुत सारी जानकारी जोड़ सकते हैं! आप GitHub पर मेरे MWE पर एक नज़र डाल सकते हैं , जहाँ एक बैकट्रेस कुछ इस तरह दिखेगी:
Library API: Exception caught in function 'api_function'
Backtrace:
~/Git/mwe-cpp-exception/src/detail/Library.cpp:17 : library_function failed
~/Git/mwe-cpp-exception/src/detail/Library.cpp:13 : could not open file "nonexistent.txt"
std::runtime_error
जब अपवाद को फेंक दिया जाता है तो आपको बहुत सारी जानकारी प्राप्त करने के लिए उप-वर्ग की आवश्यकता नहीं होती है।
उपवर्ग (केवल उपयोग करने के बजाय std::runtime_error
) में मुझे जो एकमात्र लाभ दिखाई देता है, वह यह है कि आपका अपवाद हैंडलर आपके कस्टम अपवाद को पकड़ सकता है और कुछ विशेष कर सकता है। उदाहरण के लिए:
try
{
// something that may throw
}
catch( const MyException & ex )
{
// do something specialized with the
// additional info inside MyException
}
catch( const std::exception & ex )
{
std::cerr << ex.what() << std::endl;
}
catch( ... )
{
std::cerr << "unknown exception!" << std::endl;
}