में अपवाद को स्टोर करने का सही तरीका मेरे पास एक एपीआई है जिसमें त्रुटि रिपोर्टिंग के लिए आंतरिक रूप से कुछ अपवाद हैं। मूल संरचना यह है कि इसमें रूट अपवाद ऑब्जेक्ट है जो std::exception
से प्राप्त होता है, फिर यह उसके कुछ सबक्लास को फेंक देगा।एक चर
एक लाइब्रेरी या थ्रेड में फेंकने वाले अपवाद को पकड़ने और इसे दूसरे में पकड़ने से अपरिभाषित व्यवहार हो सकता है (कम से कम क्यूटी इसके बारे में शिकायत करता है और इसे कई संदर्भों में अस्वीकार करता है)। मैं लाइब्रेरी कॉल को फ़ंक्शंस में लपेटना चाहता हूं जो एक स्टेटस कोड वापस कर देगा, और यदि कोई अपवाद हुआ, अपवाद ऑब्जेक्ट की एक प्रति।
स्टोर बाद में उपयोग के लिए एक अपवाद (इसके पॉलीमोर्फिक व्यवहार के साथ) का सबसे अच्छा तरीका क्या है? मेरा मानना है कि सी ++ 0x भविष्य एपीआई इस तरह के कुछ का उपयोग करता है। तो सबसे अच्छा तरीका क्या है?
सबसे अच्छा मैं सोच सकता हूं कि प्रत्येक अपवाद वर्ग में clone()
विधि है जो एक ही प्रकार के अपवाद के लिए सूचक लौटाएगी। लेकिन यह बहुत सामान्य नहीं है और मानक अपवादों से बिल्कुल निपटता नहीं है।
कोई विचार?
EDIT: ऐसा लगता है कि सी ++ 0x a mechanism for this होगा। इसे "लाइब्रेरी जादू" के रूप में वर्णित किया गया है। क्या इसका मतलब यह है कि सी ++ 0x की किसी भी भाषा विशेषताओं की आवश्यकता नहीं है? यदि नहीं, तो क्या कोई कार्यान्वयन है जो सी ++ 03 के साथ संगत है?
EDIT: ऐसा लगता है कि बूस्ट में implementation of exception copying है। मैं किसी भी गैर boost::copy_exception
उत्तरों के लिए प्रश्न खुला रखूंगा।
EDIT: स्मृति त्रुटि से बाहर अपवाद के मूल कारण के बारे में j_random_hacker की चिंताओं को संबोधित करने के लिए। इस विशेष पुस्तकालय और अपवादों के सेट के लिए, यह मामला नहीं है। रूट अपवाद ऑब्जेक्ट से व्युत्पन्न सभी अपवाद अमान्य उपयोगकर्ता इनपुट के कारण विभिन्न प्रकार की पार्सिंग त्रुटियों का प्रतिनिधित्व करते हैं। मेमोरी से संबंधित अपवादों को आसानी से std::bad_alloc
फेंक दिया जाएगा जिसे अलग से संबोधित किया जाता है।
लेकिन सावधान रहना है कि अपवाद के मूल कारण एक आउट-ऑफ-स्मृति शर्त है, जिसमें मामले 'क्लोन()' 'अगर यह कॉल करने के लिए कोशिश करता है new' असफल हो जायेगी हो सकता है। यह चारों ओर मिल सकता है, उदा। एक स्थिर बफर से आवंटित करने के लिए प्रत्येक अपवाद प्रकार के लिए 'ऑपरेटर नया() 'ओवरलोडिंग करके, लेकिन यह आवश्यक रूप से सुंदर नहीं है। –
@j_random_hacker: ठीक है, क्योंकि हम पंडिताऊ हो रही है, क्या आप बाहर के स्मृति बेहतर कहा जाता है बुरा alloc और यह स्मृति से बाहर वास्तविक होने की जरूरत नहीं है कहते हैं। बुरा alloc के लिए एक और कारण बहुत अधिक स्मृति का अनुरोध कर रहा है, और उस मामले में बाद में छोटे आवंटन – sbk
@sbk सफल होगा: यह वास्तव में स्मृति से बाहर चल रहा है की संभावना पर विचार करने के लिए पंडिताऊ है? –