वास्तव में एक अच्छा तरीका अपवादों के लिए एक वर्ग (या कक्षाएं) बना रहा होगा।
कुछ इस तरह:
class ConfigurationError : public std::exception {
public:
ConfigurationError();
};
class ConfigurationLoadError : public ConfigurationError {
public:
ConfigurationLoadError(std::string & filename);
};
कारण यह है कि अपवाद केवल एक स्ट्रिंग को स्थानांतरित करने की तुलना में बहुत अधिक बेहतर हैं। त्रुटियों के लिए अलग-अलग कक्षाएं प्रदान करते हुए, आप डेवलपर्स को एक पत्राचार तरीके से एक विशेष त्रुटि को संभालने का मौका देते हैं (न कि केवल एक त्रुटि संदेश प्रदर्शित करें)। यदि आप एक पदानुक्रम का उपयोग करते हैं तो आपके अपवाद को पकड़ने वाले लोग उतने ही विशिष्ट हो सकते हैं जितने की उन्हें आवश्यकता होती है।
a) किसी विशिष्ट कारण को जानने की आवश्यकता हो सकती है
} catch (const ConfigurationLoadError & ex) {
// ...
} catch (const ConfigurationError & ex) {
a) दूसरा विवरण नहीं जानना चाहता है
} catch (const std::exception & ex) {
आप इस विषय पर कुछ जानकारी https://books.google.ru/books?id=6tjfmnKhT24C पर पा सकते हैं अध्याय 17
इसके अलावा, आप एक कस्टम संदेश भी प्रदान कर सकते हैं, लेकिन सावधान रहना - इसके साथ एक संदेश लिखने के लिए सुरक्षित नहीं है या तो std::string
या std::stringstream
या किसी अन्य तरह से जो एक अपवाद पैदा कर सकता है ।
आम तौर पर, कोई फर्क नहीं पड़ता है कि आप मेमोरी को आवंटित करते हैं (सी ++ तरीके से तार के साथ काम) अपवाद के निर्माता में या फेंकने से पहले - std::bad_alloc
अपवाद को उस चीज से पहले फेंक दिया जा सकता है जिसे आप वास्तव में चाहते हैं।
तो, स्टैक पर आवंटित बफर (जैसे मैक्सिम के उत्तर में) एक सुरक्षित तरीका है।
इसे http://www.boost.org/community/error_handling.html पर बहुत अच्छी तरह से समझाया गया है
तो, एक अच्छा प्रकार का अपवाद अपवाद होगा और स्वरूपित स्ट्रिंग (कम से कम जब फेंकना) की रचना से बचना होगा।
std∷exception
साथ कोई कंस्ट्रक्टर नहीं हैchar*
।