विनाशक को ट्रिगर करने के दायरे के सामान्य निकास के विपरीत फेंकने वाले अपवाद के कारण स्टैक की अनदेखी के दौरान इसे चलाने के लिए सी ++ में एक अच्छा तरीका क्या है? मैं जानना चाहता हूं कि मैं एक वर्ग बना सकता हूं जिसमें कुछ क्लीनअप कोड है जो हमेशा सामान्य निकास पर चलता है लेकिन अपवाद होने पर छोड़ दिया जाता है।पता लगाने के दौरान जब विनाशकारी चल रहा है?
उत्तर
std::uncaught_exception()
(<exception>
में परिभाषित) अपने नाशक में आपको पता चलेगा कि यह एक अपवाद की वजह से बुलाया गया था:
class A
{
public:
~A()
{
if (std::uncaught_exception()) {
// Called because of an exception
} else {
// No exception
}
}
};
अच्छा, मैं कभी नहीं जानता था कि यह अस्तित्व में था! :-) –
उतना अच्छा नहीं जितना आप सोच सकते हैं - मेरे पोस्ट पर लिंक किए गए लेख को देखें। – Simon
यहाँ एक तरह से मैं के बारे में सोच सकते हैं, लेकिन यह अनाड़ी लगता है:
{
myCleanupClass unwindAction;
try {
// do some work which may throw exception.
} catch (...) {
unwindAction.disableDestructorWork();
throw;
}
}
ऐसा तब तक न करें जब तक आपके पास कोई अच्छा कारण न हो। अवांछित ढेर ऐसी भाषा सुविधा है कि try
ब्लॉक के अंदर सभी स्वचालित ऑब्जेक्ट्स को डिलीकेट करने के लिए लागू किया जाएगा, ताकि उनके अंदर संसाधनों को रिलीज़ करने का मौका मिले।
आप स्टैक को अनदेखा करते समय डीटीआर में क्लीनअप छोड़ना चाहते हैं, जो इसके मूल उद्देश्य को छोड़ देता है। और आप संसाधनों को लीक करने का जोखिम चलाएंगे।
उदाहरण
class CDBConnection
{
public:
CDBConnection()
{
m_db.open();
}
~CDBConnection()
{
if (!std::uncaught_exception())
m_db.close();
// if this is called during a stack unwinding,
// your DB connection will not be closed for sure.
// That's a resource leakage.
}
//..
private:
DB m_db;
};
void main()
{
//..
try
{
// code that may throw
CDBConnection db;
//..
}
catch(const CDBException& exp)
{
// properly handle the exception
}
}
शायद this लेख आपको मदद मिलेगी। लेख आपको std :: uncaught_exception() के साथ समस्याएं दिखाएगा और इसमें सलाह दी गई है कि विनाशकों में अपवादों का सामना कैसे किया जाए।
- 1. यह पता लगाने के लिए कि क्या ऐप सिंक हो रहा है जब ऐप नहीं चल रहा है
- 2. का पता लगाने जब डेटा
- 3. पता लगाने के लिए कि विंडोज़ में अपाचे किस उपयोगकर्ता के रूप में चल रहा है?
- 4. माउसअप को निकाल दिए जाने पर माउस कैसे चल रहा है यह पता लगाने के लिए?
- 5. यह पता लगाने के लिए कि कोई टाइमर चल रहा है या नहीं?
- 6. यह पता लगाने के लिए कि मेरा एएसपी.NET कोड किस खाते में चल रहा है?
- 7. यह पता लगाने के लिए कि मेरा एप्लिकेशन वर्चुअल मशीन में चल रहा है या नहीं?
- 8. यह पता लगाने के लिए कि विकास कपड़े में एज़ूर एप्लिकेशन चल रहा है?
- 9. ऑडियो चल रहा है जब ऑडियो
- 10. यह पता लगाना कि संगीत चल रहा है या नहीं?
- 11. के दौरान त्रुटि चल zipalign
- 12. त्रुटियाँ बिल्डर चल रहा 'CDT बिल्डर' जब
- 13. पता लगाएं कि मेरा एप्लिकेशन कितने धागे चल रहा है?
- 14. सी #: स्क्रीन रीडर चल रहा है या नहीं पता कैसे?
- 15. का पता लगाने जब UITableViewCell स्क्रीन
- 16. Clojure (aleph) का पता लगाने जब सर्वर
- 17. का पता लगाने जब जावास्क्रिप्ट ASP.NET
- 18. यह पता लगाने के लिए कि क्या मैं मोनो-सेवा में चल रहा हूं?
- 19. पता लगाएं कि सेलेरी उपलब्ध है/चल रहा है
- 20. का पता लगाने जब आव्यूह गुणन संभव है
- 21. चल रहा '-j2 बनाने' जब RVM
- 22. जावास्क्रिप्ट पता लगाने के लिए जब बाहरी javascripts
- 23. पता लगाएं कि कोई जावास्क्रिप्ट फ़ंक्शन चल रहा है
- 24. चल रहा है और चल रहा है mysql क्वेरी
- 25. आईओएस - का पता लगाने जब उपयोगकर्ता प्रतिलिपि क्लिपबोर्ड - [UIPasteboard generalPasteboard]
- 26. आईफोन। ध्वनि का पता लगाने के दौरान रिकॉर्डिंग शुरू करने के लिए, और चुप्पी का पता लगाने के दौरान रिकॉर्डिंग को रोकें
- 27. UILocalNotification - ऐप नहीं चल रहा है जब कैसे संभालें?
- 28. का पता लगाने जब स्क्रॉल [jQuery के बिना]
- 29. का पता लगाने के UISeachBar जब उपयोगकर्ता प्रेस खोज बटन
- 30. कैसे पता चलेगा कि MediaRecorder चल रहा है या नहीं?
दिलचस्प सवाल! मुझे यह कहने का मोह है कि यह नहीं किया जा सकता है, क्योंकि वस्तुओं को वास्तव में पता नहीं है कि एक अपवाद सक्रिय है, वे सिर्फ दायरे से बाहर निकलते हैं क्योंकि अपवाद स्टैक को खोलता है, जैसे कि वे किसी अन्य से बाहर निकलते हैं गुंजाइश। यदि कुछ भी आपको कुछ प्लेटफार्म-विशिष्ट "हैक" की आवश्यकता होगी ... –
उत्सुक क्यों आप स्टैक अनचाहे के दौरान सफाई से बचना चाहते हैं? –
@ एरिक जेड: मैं इसे स्वचालित 'स्टैक' लॉगिंग के लिए उपयोग करने के बारे में सोचा था। 'लॉग xxx ("funcA -", arg1, arg2, arg3) की रेखाओं के साथ कुछ;;, लेकिन कार्यों का वाद्य यंत्र कठिन है। –