2009-10-15 34 views

उत्तर

129

std::exception वह वर्ग है जिसका एकमात्र उद्देश्य अपवाद पदानुक्रम में आधार वर्ग के रूप में कार्य करना है। इसका कोई अन्य उपयोग नहीं है। दूसरे शब्दों में, अवधारणात्मक रूप से यह सार वर्ग है (भले ही इसे शब्द के अर्थ के सी ++ में अमूर्त वर्ग के रूप में परिभाषित नहीं किया गया हो)।

std::runtime_error एक अधिक विशिष्ट वर्ग, std::exception से उतरते, विभिन्न क्रम त्रुटि के मामले में फेंक दिया करने का इरादा है। इसका दोहरा उद्देश्य है। इसे अपने आप से फेंक दिया जा सकता है, या यह std::range_error, std::overflow_error इत्यादि जैसे विभिन्न प्रकार के विशेष प्रकार के रनटाइम त्रुटि अपवादों के लिए बेस क्लास के रूप में कार्य कर सकता है। आप std::runtime_error से उतरने के साथ-साथ अपनी परिभाषा कक्षाओं को परिभाषित कर सकते हैं, साथ ही आप परिभाषित कर सकते हैं std::exception से आपकी अपनी अपवाद कक्षाएं उतर रही हैं।

बस std::runtime_error की तरह, मानक पुस्तकालय में std::logic_error है, जो std::exception से भी उतरता है।

इस पदानुक्रम के बिंदु को उपयोगकर्ता को सी ++ अपवाद हैंडलिंग तंत्र की पूरी शक्ति का उपयोग करने का मौका देना है। चूंकि 'पकड़' खंड पॉलिमॉर्फिक अपवादों को पकड़ सकता है, इसलिए उपयोगकर्ता 'कैच' क्लॉज लिख सकता है जो अपवाद पदानुक्रम के विशिष्ट उप-भाग से अपवाद प्रकारों को पकड़ सकता है। उदाहरण के लिए, catch (std::runtime_error& e)std::runtime_error उपट्री से सभी अपवादों को पकड़ लेगा, जिससे सभी दूसरों को गुजरने के लिए अनुमति मिल जाएगी (और कॉल स्टैक को आगे बढ़ाएं)।

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

अद्यतन: पोर्टेबिलिटी लिनक्स बनाम विंडोज

लोकी astari और unixman83 के रूप में उनके जवाब और नीचे टिप्पणी में बताया गया है, exception वर्ग के निर्माता किसी भी तर्क सी ++ मानक के अनुसार नहीं लेता है। माइक्रोसॉफ्ट सी ++ में एक निर्माता exception कक्षा में तर्क ले रहा है, लेकिन यह मानक नहीं है। runtime_error कक्षा में दोनों प्लेटफॉर्म, विंडोज और लिनक्स पर एक कन्स्ट्रक्टर तर्क (char*) ले रहा है। पोर्टेबल होने के लिए, runtime_error का बेहतर उपयोग करें।

(और याद रखें, सिर्फ इसलिए कि अपनी परियोजना के एक विनिर्देश कहते हैं अपने कोड लिनक्स पर चलने के लिए नहीं है, इसका मतलब यह नहीं है कि यह लिनक्स पर चलने के लिए कभी नहीं होता।)

+0

धन्यवाद। बहुत बढ़िया जवाब। हालांकि मुझे आश्चर्य है कि अलग-अलग प्रकार के अपवाद होने की आवश्यकता है ... हालांकि एक विचार हालांकि। – sivabudh

+0

यदि कोई क्षमता है कि अपवाद को फिर से कवर किया जा सकता है, तो एक अलग प्रकार का अपवाद उपयोगी हो सकता है क्योंकि हम अपवाद हैंडलिंग तंत्र का उपयोग कर सकते हैं ताकि अपवाद को हैंडलर को निर्देशित किया जा सके जो समस्या को आजमाए और सही करे। यदि मानक अपवादों में से एक की तुलना में वसूली का कोई मौका नहीं है तो ठीक है। –

+1

बस एक तरफ के रूप में: कोई नियम नहीं है, कहीं भी, जो आपको 'std :: अपवाद' से प्राप्त करने के लिए मजबूर करता है। निश्चित रूप से, सभी 'std' चीजें उस के व्युत्पन्न वर्गों को फेंक देती हैं, लेकिन केवल' std :: अपवाद 'व्युत्पन्न वस्तुओं को फेंकने का कोई कारण नहीं है। – rubenvb

15

std :: अपवाद होना चाहिए मानक अपवाद पदानुक्रम का सार आधार माना जाता है (माना जाता है)। ऐसा इसलिए है क्योंकि किसी विशिष्ट संदेश में पास करने के लिए कोई तंत्र नहीं है (ऐसा करने के लिए आपको अवश्य प्राप्त करना चाहिए और विशेषज्ञता())। Std :: अपवाद का उपयोग करने से रोकने के लिए कुछ भी नहीं है और सरल अनुप्रयोगों के लिए यह आपकी आवश्यकता हो सकती है।

std :: runtime_error दूसरी ओर वैध रचनाकार हैं जो एक संदेश के रूप में एक स्ट्रिंग स्वीकार करते हैं।जब() को एक कॉन्स चार पॉइंटर कहा जाता है तो उस सी स्ट्रिंग पर अंक लौटाया जाता है जिसमें कन्स्ट्रक्टर में पारित वही स्ट्रिंग होती है।

try 
{ 
    if (badThingHappened) 
    { 
     throw std::runtime_error("Something Bad happened here"); 
    } 
} 
catch(std::exception const& e) 
{ 
    std::cout << "Exception: " << e.what() << "\n"; 
} 
+1

उत्तर मार्टिन के लिए धन्यवाद। हालांकि, मैं ऊपर वर्णित जैसा ही std :: अपवाद() का उपयोग करता हूं। यानी std :: अपवाद() कन्स्ट्रक्टर एक std :: string() या const char * भी ले सकता है। – sivabudh

+12

मानक के अनुसार नहीं। std :: अपवाद में एक कन्स्ट्रक्टर है जो कोई तर्क नहीं लेता है। एक std :: स्ट्रिंग या सी-स्ट्रिंग स्वीकार करने वाले संस्करण का उपयोग करना गैर पोर्टेबल है। –

+7

माइक्रोसॉफ्ट के कारण, मुझे 'std :: अपवाद (std :: string) 'फेंकने के लिए उपयोग किया गया। अब मुझे एहसास है कि मुझे 'std :: runtime_error' फेंकना होगा यदि मैं चाहता हूं कि मेरा कोड लिनक्स (जीसीसी) में काम करे। – unixman83

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