2017-01-19 5 views
10

में कस्टम अपवाद बनाना मैं सी ++ सीख रहा हूं और जब मैं कोशिश करता हूं और अपना अपवाद बनाता हूं और उन्हें लिनक्स पर फेंकता हूं तो मुझे अनुभव होता है।सी ++

मैंने अपने कार्यान्वयन का परीक्षण करने के लिए एक छोटा परीक्षण प्रोजेक्ट बनाया है और नीचे मेरा अपवाद वर्ग हैडर फ़ाइल है।

class TestClass : public std::runtime_error 
{ 
public: 
    TestClass(char const* const message) throw(); 
    virtual char const* what() const throw(); 
}; 

अपवाद वर्ग के लिए स्रोत फ़ाइल

using namespace std; 

TestClass::TestClass(char const* const message) throw() 
    : std::runtime_error(message) 
{ 

} 

char const * TestClass::what() const throw() 
{ 
    return exception::what(); 
} 

अपने मुख्य अनुप्रयोग में, मैं एक समारोह जो मेरे अपवाद फेंकता है और आज़माएं/कैच में यह फैल जाती है इस प्रकार बोल रहा हूँ है:

void runAFunctionAndthrow(); 

/* 
* 
*/ 
int main(int argc, char** argv) { 
    try 
    { 
     cout << "About to call function" << endl; 
     runAFunctionAndthrow(); 
    } 
    catch (TestClass ex) 
    { 
     cout << "Exception Caught: " << ex.what() << endl; 
    } 

    return 0; 
} 

void runAFunctionAndthrow() 
{ 
    cout << "going to run now. oh dear I need to throw an exception" << endl; 

    stringstream logstream; 
    logstream << "This is my exception error. :("; 
    throw TestClass(logstream.str().c_str()); 
} 

जब मैं चलाने मैं निम्नलिखित उत्पादन प्राप्त करने के लिए उम्मीद कर रहा हूँ:

About to call function

Going to run now. oh dear I need to throw an exception

Exception Caught: This is my exception error. :(

इसके बजाय मैं क्या मिल रहा है

About to call function

going to run now. oh dear I need to throw an exception

Exception Caught: std::exception

सूचना अंतिम पंक्ति यह कहता है std :: मेरे वास्तविक अपवाद संदेश के बजाय अपवाद नहीं है "यह मेरा अपवाद त्रुटि है"।

यह क्यों है, यह विंडोज़ पर ठीक काम करता है लेकिन लिनक्स पर यह करता है।

मैंने जो कुछ किया है, उससे मैंने जो कुछ देखा है, वह सही है, इसलिए मुझे क्या याद आ रहा है।

+0

'क्या()' आप शायद मतलब 'वापसी runtime_error :: क्या() में,' - जो reimplementation पूरी तरह छोड़ माना जायेगा (आधार वर्ग व्यवहार यहाँ पहले से ही अच्छा आप के लिए है)। –

उत्तर

17

आपका what() रिटर्न:

return exception::what(); 

std::exception::what() से वापसी मान specified as follows है:

Pointer to a null-terminated string with explanatory information.

यह है कि। और कुछ नहीं, और कुछ नहीं। जो पाठ आप दिखा रहे हैं वह निश्चित रूप से "व्याख्यात्मक जानकारी" के रूप में योग्यता प्राप्त करता है। और what() के वापसी मूल्य के लिए यह एकमात्र आवश्यकता है (एक दूसरे को छोड़कर जो यहां जर्मनी नहीं है)।

दूसरे शब्दों में, सी ++ आपको what() के साथ प्राप्त होने वाली सटीक सामग्री की गारंटी नहीं देता है। what() आपको लगता है कि what() है, जैसा कि कहा जाता है।

यदि आप अपने अपवाद का वर्णन करना चाहते हैं, तो किसी भी तरह से, यह आपके what() के हिस्से के रूप में लागू करने के लिए आप पर निर्भर है।

+1

यह देखते हुए कि '' TestClass' विरासत में std :: runtime_error' यह सिर्फ reimplementing से बच सकते हैं 'क्या()' - 'std :: runtime_error :: क्या()' पहले से ही संदेश अपने निर्माता के लिए पारित देता है। –

+0

@MatteoItalia मैंने अभी देखा है और इसे अपनी स्पष्टीकरण से आपकी टिप्पणी से पहले एक कोशिश की है और यह वही करता है जो मैं अब उम्मीद कर रहा था। आपकी मदद के लिए धन्यवाद – Boardy

0

आपको std :: अपवाद के लिए एक कस्टम त्रुटि संदेश निर्दिष्ट करने का एक तरीका चाहिए जो afaik की अनुमति नहीं है। एक संभावित समाधान के लिए this देखें।

8

आप क्या() विधि का अपना स्वयं का कार्यान्वयन की जरूरत है या std::runtime_error::what() का उपयोग के रूप में टिप्पणी

में लिखा कहो:

class TestClass : public std::runtime_error 
{ 
    std::string what_message; 
public: 
    const char* what() override 
    { 
     return what_message.c_str(); 
    } 
}; 

इसके अलावा, बेहतर noexcept बजाय throw() का उपयोग करें और के बाद ही आप उनके बारे में पढ़ा - link

और अपने कोशिश पकड़ में:

catch (const TestClass& myException) 

के बजाय catch(TestClass myException) - अन्यथा आप एक अंतर्निहित प्रति जो संभवतः एक अपवाद फेंक में परिणाम कर सकते हैं। यह polymorphism भी तोड़ता है: यदि आप catchpure virtual interface कार्यान्वयन उदाहरण चाहते हैं, तो आपको एक संदर्भ का उपयोग करने की आवश्यकता होगी।

+0

आह जानना अच्छा है, अतिरिक्त जानकारी के लिए धन्यवाद। – Boardy