2015-07-14 10 views
5

मैं सोच रहा था कि सी ++ मानक पुस्तकालय में परिभाषित अपवादों को फेंकने के लिए ठीक है या नहीं, बल्कि अपनी कक्षा बनाने के बजाय। हम की तरह कुछ कर सकता है, बेशकक्या सी ++ मानक पुस्तकालय में परिभाषित अपवाद फेंकना ठीक है?

#include <stdexcept> 
#include <iostream> 
#include <string> 

bool useless_function(const std::string& str) { 
    if (str == "true") 
     return true; 

    else if (str == "false") 
     return false; 

    else 
     throw std::invalid_argument("Expected argument of either true or false"); 
} 

और उसके बाद: उदाहरण के लिए, निम्नलिखित (बेवकूफ) समारोह है कि एक तर्क के रूप में एक स्ट्रिंग लेता है पर विचार करते हैं

int main(int argc, const char** argv) { 
    try { 
     const bool check = useless_function("not true"); 
    } 

    catch (std::invalid_argument& error) { 
     std::cerr << error.what() << '\n'; 
    } 

    return 0; 
} 

मैं here पढ़ा है कि std::stoi फंक्शंस का परिवार std::invalid_exception अपवाद फेंक देता है जब उन्हें एक अवैध तर्क मिलता है; यही वह जगह है जहां से उपर्युक्त विचार आया था।

+0

आपके लिए उपयोग किए जाने के लिए तैयार किए गए अपवाद वर्गों के साथ एक संपूर्ण शीर्षलेख, '' है, ताकि आप अपने स्वयं के पहियों का आविष्कार न करें। –

उत्तर

4

हां, अपने स्वयं के उद्देश्यों के लिए मानक अपवाद वर्गों का उपयोग करना बिल्कुल ठीक है। यदि वे आपकी स्थिति को अच्छी तरह से फिट करते हैं, तो आगे बढ़ें (लेकिन जब कोई मानक वर्ग अच्छी तरह फिट बैठता है तो अपनी कक्षा को परिभाषित करने में संकोच न करें)।

यह भी ध्यान रखें कि आप मानक कक्षाओं से प्राप्त कर सकते हैं, इसलिए यदि आप मानक वर्ग में मौजूद अधिक सटीक या नए व्यवहार को जोड़ सकते हैं, तो भी आप इसे बेस क्लास के रूप में उपयोग करना चाहेंगे।

बेहतर प्रश्न (आईएमओ) तब होगा जब यह आपके अपवाद वर्गों को परिभाषित करने के लिए समझ में आएगा (जो कम से कम मानक से प्राप्त नहीं होते हैं)। यहां एक स्पष्ट उम्मीदवार होगा यदि आप what() जैसे कुछ का समर्थन करना चाहते हैं जो यूटीएफ -16 या यूटीएफ -32 एन्कोडिंग जैसी कुछ स्ट्रिंग देता है, इसलिए "स्टॉक" "std :: अपवाद" अधिक प्रदान नहीं करेगा (यदि कोई हो) उपयोगिता, और आप शुरुआत से शुरू करने के साथ काफी अटक गए हैं।

+0

धन्यवाद! मुझे यह सुनिश्चित नहीं था कि ' 'में कक्षाएं गैर-मानक-लाइब्रेरी कोड द्वारा उपयोग की जाने वाली थीं या नहीं। – ra1nmaster

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