से प्राप्त करना मैं अपनी लॉग फ़ाइलों में विशिष्ट जानकारी जोड़ने के लिए std :: अपवाद से प्राप्त करना चाहता हूं, लेकिन मैं यह नहीं समझ सकता कि std :: अपवाद से .what() तक कैसे पहुंचे।std :: अपवाद
इसके अलावा, मुझे पता है कि मेरे अपवाद हैंडलर में एक स्ट्रिंग बनाने के लिए असुरक्षित है, लेकिन मैं इस विषय पर एक विशेषज्ञ नहीं हूं, तो कुछ सुरक्षित विकल्प क्या हैं?
struct Exception : public std::exception, private boost::noncopyable
{
public:
Exception(std::string msg)
: message(msg)
{}
~Exception()
{}
virtual const char* what() const throw
{
std::string what = message + // and now what? base.what()
LOG(what); // write to log file
return what.c_str();
}
private:
std::string message;
};
संपादित करें: मैं सच में मेरे सवाल का गलत तरीके से कहा है। मुझे सुरक्षा में दिलचस्पी है, मैंने सोचा कि लॉगिंग के लिए अधिक डेटा होना अच्छा लगेगा। मैं गलत था।
अब, मैं खराब स्ट्रॉल के कारण संदेश स्ट्रिंग द्वारा फेंकने वाले Bad_alloc के बारे में इतना पागल नहीं हूं, इसके बजाय मुझे एक साफ संदेश होगा। कहा जा रहा है कि मैंने कुछ सामान फिर से लिखा है:
struct Exception : public std::exception
{
public:
Exception(std::string msg)
: message(msg)
{}
~Exception()
{}
virtual const char* what() const throw
{
LOG(what); // write to log file
return what.c_str();
}
private:
std::string message;
};
अभी भी उस कोड के बारे में कोई बड़ी चिंता है? LOG() std :: अपवाद को फेंक देता है I मामला कुछ गलत हो जाता है, क्योंकि मैं व्युत्पन्न अपवाद वर्ग द्वारा लॉग कॉलिंग का अनंत लूप नहीं चाहता था, और वह वर्ग फिर से लॉग को कॉल करता है जो एक ही अपवाद को फिर से उत्पन्न करेगा। क्या यह काम जैसा मैं चाहता हूं, या मेरे व्युत्पन्न क्लास कॉल टर्मिनेट() में लॉगिंग अपवाद होगा या कोर डंप का कारण बन जाएगा?
पुन: सुरक्षित विकल्प। यह एक बड़ा सवाल है। अपने स्वयं के प्रश्न के लिए उपयुक्त है। –
स्टैक ओवरफ़्लो में आपका स्वागत है। ऐसा लगता है कि आप * दो * प्रश्न पूछ रहे हैं (जिसका अर्थ है कि आपको दो अलग-अलग पोस्ट करना चाहिए)। एक पूछता है कि बेस क्लास से विरासत विधि को कैसे कॉल किया जाए, और दूसरे स्ट्रिंग के बिना अपवाद संदेश को स्टोर करने के लिए कहता है (संभवतः क्योंकि आप स्मृति आवंटित नहीं करना चाहते हैं और 'bad_alloc' का जोखिम लेना चाहते हैं)। विशेष रूप से 'std :: अपवाद' से प्राप्त करने के साथ वास्तव में कुछ भी नहीं है। अलग, विशिष्ट प्रश्न अधिक वर्णनात्मक प्रश्न शीर्षक और अधिक उपयोगी उत्तरों की ओर ले जाते हैं। कृपया इस सवाल को विभाजित करने पर विचार करें। –
यदि आपका कोड टाइप अपवाद ("...") का अपवाद फेंकता है, तो आप std :: अपवाद :: क्या() लौटने की उम्मीद करते हैं? मुझे नहीं लगता कि इसमें कुछ भी उपयोगी होगा (यदि इसमें कुछ भी शामिल है)। मैं बस संदेश.c_str() लौटने का सुझाव दूंगा। – Ferruccio