2010-08-26 8 views
7

कोड:सिस्टम के बाहर क्या अपवाद स्ट्रिंग = स्ट्रिंग फेंक सकता है। OutOfMemoryException?

public Constructor(string vConnection_String) 
    { 
    try 
    { 
     mConnection_String = vConnection_String; 
    } 
    catch (Exception ex) 
    { 
     ExceptionHandler.CatchEx(ex); 
    } 
    } 

मुझे लगता है कि जो व्यक्ति क्रमादेशित इस "सिर्फ सावधान किया जा रहा है," लेकिन दिलचस्पी की वजह से क्या अपवाद एक पंक्ति है कि यह एक यहाँ इस तरह की स्ट्रिंग काम करता है पर फेंक दिया जा सकता है? मैं System.OutOfMemoryException के बारे में सोच सकता हूं, लेकिन दूसरों क्या?

धन्यवाद

+2

क्या mConnection_String में एक सेटटर है जो अपवाद फेंक सकता है? (मुझे पता है कि mConnection_String का नामकरण सम्मेलन यह सुझाव नहीं देता है कि यह मामला है) – Brandon

+2

हो सकता है कि 'try' 'catch' मूल कोड का शेष शेष हो (जहां शायद यह कनेक्शन का परीक्षण करने का प्रयास किया गया हो) – Nissim

+0

मुझे लगता है कि आप नहीं कर सकते यहां तक ​​कि OutOfMemoryException भी प्राप्त करें। सदस्य चर पहले ही आवंटित किया गया है, असाइनमेंट केवल उस चर के संदर्भ को लिखता है। –

उत्तर

3

Herb Sutter अपवाद सुरक्षा के बारे में कई महान लेख लिखने, और one of them में वह अपवाद सुरक्षा के 3 प्रकार पता चलता है:

  1. बुनियादी गारंटी

  2. मजबूत गारंटी

  3. nothrow गारंटी

यह सिद्धांत आमतौर पर सी ++ दुनिया में जाना जाता है लेकिन हम उन्हें .NET दुनिया में भी उपयोग कर सकते हैं क्योंकि उनमें से एक आपकी स्थिति में होता है।

mConnection_String प्रकार System.String (या किसी अन्य संदर्भ प्रकार) की तुलना में आप निश्चित रूप से पता है, कि इस कोड "गारंटी nothrow" है के एक क्षेत्र है, क्योंकि संदर्भ प्रकार के लिए सरल काम बिल्कुल अपवाद फेंक नहीं कर सकता ।

+0

उत्तर और सूचनात्मक लिंक सर्गेई के लिए धन्यवाद। – AndrewJacksonZA

2

एक OutOfMemoryException, बहुत यहाँ होने की संभावना नहीं है क्योंकि स्ट्रिंग है कॉपी नहीं है और कोई नया स्मृति आवंटित किया जाना चाहिए।

2

कोई भी जिसे मैं सोच सकता हूं। मेमोरी अपवाद भी नहीं। स्ट्रिंग्स को string pool में संग्रहीत किया जाता है। यदि आपके प्रोग्राम में दो बार एक ही स्ट्रिंग है, तो वे दोनों स्ट्रिंग पूल में एक ही स्ट्रिंग उदाहरण का संदर्भ देते हैं।

String.Intern() के लिए भी दस्तावेज़ देखें।

संपादित: जैसा कि एक टिप्पणी में कहा, स्ट्रिंग पूल यहाँ अप्रासंगिक है के बाद से यह बस एक संदर्भ काम (है, लेकिन इसके बारे में कुछ जानकारी, फिर भी उपयोगी है, हालांकि यह सवाल कोई लेना देना नहीं, के बारे में खेद है उस)। असाइनमेंट के बाद दोनों चर मेमोरी में सटीक उसी ऑब्जेक्ट को इंगित करेंगे और कोई नई मेमोरी का दावा नहीं किया जाएगा।

+0

नहीं, यह केवल स्ट्रिंग अक्षर के लिए सच है, यानी आपके कोड या स्ट्रिंग्स में निरंतर स्ट्रिंग एक्सप्रेशन जो स्पष्ट रूप से प्रशिक्षित हैं। 'स्ट्रिंग एस 1 =" हैलो "; 'और' स्ट्रिंग एस 2 =" नरक "+ 'ओ'; 'वास्तव में अलग स्ट्रिंग ऑब्जेक्ट्स और' ऑब्जेक्ट हैं। रेफरेंस एक्वाल्स (एस 1, एस 2) 'झूठी वापसी करेगा हालांकि दोनों स्ट्रिंग बराबर हैं। –

+2

स्ट्रिंग पूल यहां अप्रासंगिक है। यह केवल एक संदर्भ प्रति है। इसके बाद, mConnection_String और vConnection_String एक ही ऑब्जेक्ट को इंगित करता है। यदि vConnection_String बदल दिया गया है, तो यह नई स्मृति असाइन की गई है ... –

+0

आप बिल्कुल सही हैं। मैं अपना जवाब अपडेट करूंगा ... धन्यवाद। –

3

मेरे दृष्टिकोण में कुछ भी नहीं हो सकता है। यदि आप उपवर्तन की तरह कुछ उपयोग करते हैं तो आप शायद देखेंगे कि किसी ने अपवाद हैंडलिंग को हटाए बिना यहां कुछ कोड हटा दिया है। अन्यथा यह सिर्फ मूर्ख है।

आप बिना किसी संदेह के वर्बोज़ कोड को हटा सकते हैं।

3

मैं नहीं देख सकता कि इससे कोई अपवाद कैसे उत्पन्न होगा। मैं कल्पना प्रोग्रामर महज एक ctor tempate वह का उपयोग करता है:

try 
{ 
    /// Put Ctor code here! 
} 
catch (Exception ex) 
{ 
    ExceptionHandler.CatchEx(ex); 
} 
1

... ThreadAbortException? (लेकिन इसे पकड़ ब्लॉक के बाद फिर से फेंक दिया जाएगा।)

+0

जरूरी नहीं: सभी के लिए हम जानते हैं ** ExceptionHandler ** थ्रेड aborts रीसेट कर सकता है! (हाँ, यह एक खिंचाव है।) –

+0

@ पॉल: अच्छा बिंदु - यह भी एक संभावना है। –

0

फेंक दिया अपवाद mConnection_String पर निर्भर करेगा।

यदि mConnection_Stringफ़ील्ड है, तो किसी भी अपवाद को फेंकने की संभावना बहुत कम है। कोशिश करें .. पकड़ तर्क शायद मानक बॉयलर प्लेट कोड के रूप में है ताकि जब कोड बाद में जोड़ा जाए, तो यह प्रयास में है ... पकड़ ब्लॉक।

हैं mConnection_String एक संपत्ति, तो यह किसी भी अपवाद जो सेट संपत्ति में फेंक दिया जा सकता है (और पकड़े नहीं) फेंक दिया जा सकता है। क्या संभव है यह देखने के लिए आपको सेट प्रॉपर्टी में देखना होगा।

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