2010-11-08 15 views
5

अपवाद वर्ग में एक सेटटर सदस्य फ़ंक्शन होने का क्या प्रभाव हो सकता है? एक सेटर रखने के लिए प्रेरणा यह है कि कभी-कभी पकड़ के बिंदु पर अपवाद को सही तरीके से संभालने के लिए फेंकने के बिंदु पर पर्याप्त डेटा उपलब्ध नहीं होता है; इसलिए जब स्टैक अवांछित हो रहा है तो अतिरिक्त जानकारी को जोड़ना होगा।अपवाद वर्ग में सेटर

+1

एक उचित विचार की तरह लगता है। – Jay

+1

और कौन सा कोड चल रहा है * जबकि * ढेर अवांछित है? – Anon

+0

उसका मतलब है एक और पकड़ ब्लॉक में। – Skurmedel

उत्तर

3

जबकि आप मूल अपवाद चिकित्सक कर सकते थे, मैं जावा में उपयोग की जाने वाली तकनीक को पसंद करूंगा: आप मूल को पकड़ते हैं और एक नया अपवाद फेंक देते हैं जो मूल को इसके कारण के रूप में संदर्भित करता है।

+0

@ आओन: और आपने अभी स्टैक फ्रेम खो दिया है ... –

+0

@ मैथ्यूयू: सहमत। यदि आप एक नया अपवाद फेंकते हैं, तो आप स्टैक डीबगिंग जानकारी खो देते हैं। – Puppy

+0

मूलभूत एम्बेडिंग आपको स्लाइसिंग समस्या पर उजागर कर सकती है, यदि आप बेस क्लास पकड़ते हैं लेकिन पकड़ा अपवाद कुछ व्युत्पन्न होता है। आपको पॉइंटर द्वारा फेंकने और पकड़ने की आवश्यकता होगी, लेकिन यह सामान्य नहीं है और स्वयं की कुछ समस्याएं पैदा करता है। –

1

सबसे पहले, यह एक अच्छा विचार की तरह लगता है।

मैं सी ++ अपवाद हैंडलिंग की बजाय एसईएच (विंडोज़-विशिष्ट अपवाद हैंडलिंग, सी ++ से संबंधित नहीं) का उपयोग करता हूं। विशेष रूप से इसके कारण - यह स्टैक अनचाहे शुरू होने से पहले अधिक जानकारी एकत्र करने की अनुमति देता है।

लेकिन मैंने कभी ऐसा प्रकार फेंकने के बारे में सोचा नहीं है जो जानकारी एकत्रित करेगा।

तकनीकी रूप से बोलने - कोई समस्या नहीं है। मुझे पता है कि एमएसवीसी (असेंबलर स्तर तक) द्वारा अपवाद हैंडलिंग कैसे कार्यान्वित किया जाता है, और इस विचार के साथ कुछ भी गलत नहीं है।

  1. catch ब्लॉक के बाद ढेर खुला हुआ किया गया है शुरू हो जाती है: कुछ बिंदुओं कि उल्लेख किया जाना चाहिए वहाँ। ताकि उचित try ब्लॉक के भीतर सब कुछ पहले से ही नष्ट हो गया है।
  2. एक अपवाद को रेथ्रोइंग एक महत्वपूर्ण प्रदर्शन हिट का कारण बनता है।
1

मुझे लगता है कि अंतर्निहित समस्या यह है कि फेंकने (निम्न-स्तरीय) कोड में कोड के रूप में अधिक संदर्भ/जानकारी नहीं होती है।

आप या तो एक नया अपवाद बना सकते हैं जो अपवाद का बेहतर वर्णन करता है, मूल अपवाद को आंतरिक अपवाद के रूप में लपेटता है। मैंने इसे कुछ बार किया है लेकिन मुझे एहसास है कि यह सभी परिस्थितियों में शायद ही व्यावहारिक है।

मुझे पता है कि कुछ ढांचे में "डेटा" -प्रोपर्टी है जो मनमाने ढंग से डेटा के साथ एक या अधिक शब्दकोश है। यह मेरे लिए बुरा नहीं लगता है, हालांकि यह दुर्व्यवहार के लिए खुलता है। इसे प्रोग्रामेटिक फैसले बनाने के लिए शायद इस्तेमाल नहीं किया जाना चाहिए, यह मानव उपभोग के लिए होना चाहिए।

अगर कुछ अपवाद पकड़ता है, और पैरामीटर एक्स के आधार पर निर्णय लेता है तो यह काफी गन्दा हो सकता है।

5

चेक बाहर Boost.Exception पुस्तकालय और बहुत सटीक रूप शीर्षक से सक्रिय अपवाद को मनमाने ढंग से डेटा का जोड़ना पैराग्राफ में this page ऑब्जेक्ट्स:

void parse_file(char const * file_name) 
{ 
    boost::shared_ptr<FILE> f = file_open(file_name,"rb"); 
    assert(f); 
    try 
    { 
     char buf[1024]; 
     file_read(f.get(), buf, sizeof(buf)); 
    } 
    catch(boost::exception & e) 
    { 
     e << boost::errinfo_file_name(file_name); 
     throw; 
    } 
} 

व्यक्तिगत तौर पर मैं कलाओं बहुत प्रभावी हैं। अपवाद को संशोधित करें (संदर्भ जोड़ना) और पुनर्स्थापित करें।

जावा के विपरीत, सी ++ में आप तय करते हैं कि आप अपना अपवाद बनाते समय स्टैक फ्रेम शामिल करते हैं या नहीं, तो आप इसे खोने का जोखिम नहीं उठाते हैं और यह अभी भी उस कोड के बिंदु को संदर्भित करेगा जो फेंक दिया गया है महत्वपूर्ण संदर्भ होने पर पहला अपवाद।

+1

बूस्ट में इसे ढूंढना तकनीक के अच्छे समर्थन की तरह लगता है, भले ही आप बूस्ट का उपयोग करना पसंद न करें। –

संबंधित मुद्दे