std::runtime_error
और std::exception
के बीच क्या अंतर है? प्रत्येक के लिए उचित उपयोग क्या है? वे पहली जगह क्यों अलग हैं?अंतर: std :: runtime_error बनाम std :: अपवाद()
उत्तर
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
का बेहतर उपयोग करें।
(और याद रखें, सिर्फ इसलिए कि अपनी परियोजना के एक विनिर्देश कहते हैं अपने कोड लिनक्स पर चलने के लिए नहीं है, इसका मतलब यह नहीं है कि यह लिनक्स पर चलने के लिए कभी नहीं होता।)
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";
}
उत्तर मार्टिन के लिए धन्यवाद। हालांकि, मैं ऊपर वर्णित जैसा ही std :: अपवाद() का उपयोग करता हूं। यानी std :: अपवाद() कन्स्ट्रक्टर एक std :: string() या const char * भी ले सकता है। – sivabudh
मानक के अनुसार नहीं। std :: अपवाद में एक कन्स्ट्रक्टर है जो कोई तर्क नहीं लेता है। एक std :: स्ट्रिंग या सी-स्ट्रिंग स्वीकार करने वाले संस्करण का उपयोग करना गैर पोर्टेबल है। –
माइक्रोसॉफ्ट के कारण, मुझे 'std :: अपवाद (std :: string) 'फेंकने के लिए उपयोग किया गया। अब मुझे एहसास है कि मुझे 'std :: runtime_error' फेंकना होगा यदि मैं चाहता हूं कि मेरा कोड लिनक्स (जीसीसी) में काम करे। – unixman83
- 1. std :: के बारे में उलझन में runtime_error बनाम std :: logic_error
- 2. नई std :: अपवाद बनाम फेंक std :: अपवाद
- 3. लापता std :: क्यूटी + MinGW में runtime_error
- 4. std :: cin.getline() बनाम std ::
- 5. std :: अपवाद
- 6. std :: this_thread :: उपज() बनाम std :: this_thread :: sleep_for()?
- 7. प्रदर्शन std :: strstr बनाम std :: स्ट्रिंग ::
- 8. std :: स्ट्रिंग :: लंबाई() बनाम std :: स्ट्रिंग :: आकार()
- 9. std :: सूची बनाम std :: वेक्टर पुनरावृत्ति
- 10. std :: runtime_error कन्स्ट्रक्टर में पारित स्ट्रिंग की प्रतिलिपि बनाता है?
- 11. std :: size_t बनाम size_t बनाम std :: string :: size_type
- 12. std :: हैश_सेट बनाम std :: unordered_set, क्या वे वही बात हैं?
- 13. सी ++ std :: वेक्टर emplace बनाम
- 14. std :: स्ट्रिंग बनाम char *
- 15. std :: एसटीडी बनाम mem_fun :: mem_fn
- 16. std :: vector बनाम std :: सूची बनाम std :: slist का सापेक्ष प्रदर्शन?
- 17. std :: stringstream और std :: ios :: बाइनरी
- 18. std :: धागा निर्माण फेंकता अपवाद
- 19. std :: वेक्टर बनाम सामान्य सरणी
- 20. std :: quick_exit और std :: abort के बीच क्या अंतर है और std :: quick_exit क्यों आवश्यक था?
- 21. std :: परमाणु | तुलना_exchange_weak बनाम तुलना_exchange_strong
- 22. std :: is_integer और std :: is_integral के बीच अंतर?
- 23. std :: condition_variable और std :: condition_variable_any के बीच क्या अंतर है?
- 24. std :: merge और std :: set_union के बीच क्या अंतर है?
- 25. std :: std :: weak_ptr key
- 26. बार्टन-नाकमैन बनाम std :: enable_if
- 27. std :: cout या std :: ofstream (file)
- 28. std :: std :: function से बांधें?
- 29. std :: map को std :: C++
- 30. std :: vector और std :: list
धन्यवाद। बहुत बढ़िया जवाब। हालांकि मुझे आश्चर्य है कि अलग-अलग प्रकार के अपवाद होने की आवश्यकता है ... हालांकि एक विचार हालांकि। – sivabudh
यदि कोई क्षमता है कि अपवाद को फिर से कवर किया जा सकता है, तो एक अलग प्रकार का अपवाद उपयोगी हो सकता है क्योंकि हम अपवाद हैंडलिंग तंत्र का उपयोग कर सकते हैं ताकि अपवाद को हैंडलर को निर्देशित किया जा सके जो समस्या को आजमाए और सही करे। यदि मानक अपवादों में से एक की तुलना में वसूली का कोई मौका नहीं है तो ठीक है। –
बस एक तरफ के रूप में: कोई नियम नहीं है, कहीं भी, जो आपको 'std :: अपवाद' से प्राप्त करने के लिए मजबूर करता है। निश्चित रूप से, सभी 'std' चीजें उस के व्युत्पन्न वर्गों को फेंक देती हैं, लेकिन केवल' std :: अपवाद 'व्युत्पन्न वस्तुओं को फेंकने का कोई कारण नहीं है। – rubenvb