2014-10-02 7 views
7

मैं ऑब्जेक्ट का उपयोग करने से खुद को कैसे बचा सकता हूं जो अपवादों का उपयोग करते समय पूरी तरह से नहीं बनाया गया है? क्या मुझे कन्स्ट्रक्टर में पकड़ना चाहिए? या शायद यह बुरा अभ्यास है? अगर मैं कन्स्ट्रक्टर ऑब्जेक्ट में पकड़ लेगा तो बनाया जाएगा।सी ++ कन्स्ट्रक्टर में पकड़ा अपवाद

#include <stdio.h> 

class A 
{ 
public: 
    A() 
    { 
     try { 
      throw "Something bad happened..."; 
     } 
     catch(const char* e) { 
      printf("Handled exception: %s\n", s); 
     } 
     // code continues here so our bad/broken object is created then? 
    } 
    ~A() 
    { 
     printf("A:~A()"); 
    } 

    void Method() 
    { // do something 
    } 
}; 

void main() 
{ 
    A object; // constructor will throw... and catch, code continues after catch so basically we've got 
       // broken object. 

    //And the question here: 
    // 
    //* is it possible to check if this object exists without catching it from main? 
    // &object still gives me an address of this broken object so it's created but how can I protect myself 
    // from using this broken object without writing try/catch and using error codes? 
    object.Method(); // something really bad. (aborting the program) 

}; 
+0

आप अपने आप पर पूरी तरह से मनमानी प्रतिबंध क्यों लगाते हैं? –

उत्तर

9

भाषा में किसी भी पहचान योग्य तरीके से किसी वस्तु का "अमान्य" होने की कोई अवधारणा नहीं है।

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

यदि यह किसी कारण से कोई विकल्प नहीं है, तो आपको ऑब्जेक्ट को "अमान्य" के रूप में चिह्नित करने के अपने तरीके की आवश्यकता होगी; शायद सफलता का संकेत देने के लिए कन्स्ट्रक्टर के अंत में एक बूलियन सदस्य चर सेट करें। यह flaky और त्रुटि प्रवण है, तो यह तब तक मत करो जब तक कि आपके पास बहुत अच्छा कारण नहीं है।

+0

धन्यवाद, यही वह है जिसे मैं जानना चाहता था। – user3841735

2

ऑब्जेक्ट में कोई अमान्य राज्य जब एक निश्चित अपवाद फेंक दिया जाता है में है, तो मैं अपवाद कॉल स्टैक तो फोन करने वाले इस तरह की चीजों को अधिसूचित किया जा सकता है (और इसलिए प्रतिक्रिया) दिया जाएगा।

हालांकि, यदि अपवाद एक है जिसे आप पुनर्प्राप्त कर सकते हैं, तो ऐसा करने के लायक हो सकता है ताकि आपके आवेदन पर निर्भर हो। यह सुनिश्चित करने के लिए कि आप यह हो रहा है, यह सुनिश्चित करने के लिए कि आप लॉगर की तरह कुछ भी उपयोग करते हैं या यहां तक ​​कि बस stderr भी उपयोग करते हैं।

1

मैं इस तरह अधिक कुछ करने का एक पहली यात्रा सुझाव देने के लिए जा रहा हूँ: यहाँ

try { 
     throw "Something bad happened..."; 
    } 
    catch(const std::exception e) { 
     cerr << e.what() << endl ; // Better off in the main 
     throw ; 
    } 

दो बातें:

  1. जब तक आपकी अपवाद संचालक अपवाद संभालती है, फेंक देना चाहिए।

  2. हमेशा std :: अपवाद के आधार पर अपवाद कक्षाओं का उपयोग करें ताकि आप हमेशा यह पता लगा सकें कि ऊपर क्या दिखाया गया था।

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