मानक C ++ लाइब्रेरी में कौन सी अपवाद कक्षाएं हैं


102

मानक C ++ लाइब्रेरी में शामिल किए गए अपवाद वर्ग क्या हैं, और उनका उपयोग किस लिए किया जाना चाहिए? मुझे पता है कि कुछ नए C ++ 11 अपवाद हैं, लेकिन मुझे यकीन नहीं है कि वे क्या हैं या वे कहाँ हैं।

जवाबों:


124
std::exception <exception> interface (debatable if you should catch this)
    std::bad_alloc <new> failure to allocate storage
        std::bad_array_new_length <new> invalid array length
    std::bad_cast <typeinfo> execution of an invalid dynamic-cast
    std::bad_exception <exception> signifies an incorrect exception was thrown
    std::bad_function_call <functional> thrown by "null" std::function
    std::bad_typeid <typeinfo> using typeinfo on a null pointer
    std::bad_weak_ptr <memory> constructing a shared_ptr from a bad weak_ptr
    std::logic_error <stdexcept> errors detectable before the program executes
        std::domain_error <stdexcept> parameter outside the valid range
        std::future_error <future> violated a std::promise/std::future condition
        std::invalid_argument <stdexcept> invalid argument
        std::length_error <stdexcept> length exceeds its maximum allowable size
        std::out_of_range <stdexcept> argument value not in its expected range
    std::runtime_error <stdexcept> errors detectable when the program executes
        std::overflow_error <stdexcept> arithmetic overflow error.
        std::underflow_error <stdexcept> arithmetic underflow error.
        std::range_error <stdexcept> range errors in internal computations
        std::regex_error <regex> errors from the regular expression library.
        std::system_error <system_error> from operating system or other C API
            std::ios_base::failure <ios> Input or output error

स्रोत: http://en.cppreference.com/w/cpp/error/exception
अभ्यास में, सबसे अपवाद से ली गई कस्टम अपवाद हैं logic_errorऔर runtime_error। ऐसा नहीं है कि ये उपेक्षित हैं, लेकिन यह कि कई अपवाद डोमेन विशिष्ट हैं।

ध्यान रखें कि एक अपवाद को प्रतिबिंबित करना चाहिए कि क्या गलत हुआ और किसने नहीं फेंका। (नहीं "MyProgramException")


bad_function_call, domain_error, and future_errormsdn पर वे सबसे खराब परीक्षा देते हैं और समझाया जाता है :(
Mr.Anubis

bad_function_callडिफ़ॉल्ट रूप से निर्मित std :: फ़ंक्शन ऑब्जेक्ट होने पर फेंका जाता है और आप उस फ़ंक्शन को कॉल करने का प्रयास करते हैं जो इसे लपेटता है। चूंकि कोई लिपटे फ़ंक्शन नहीं है, इसलिए कॉल करने के लिए कुछ भी नहीं है।
पीट बेकर

1
bad_function_callफेंक दिया जाता है जब आप तैयार करने का प्रयास std::functionनहीं करते हैं (उर्फ, डिफ़ॉल्ट रूप से निर्मित या स्पष्ट रूप से नल्टर के माध्यम से साफ किया गया)। future_errorका उपयोग तब किया जाता है जब आप promiseऔर के लिए कार्यों के कई पूर्व शर्त में से एक का उल्लंघन करते हैं future। और domain_error(सिद्धांत रूप में) उन मामलों के लिए है जहां किसी फ़ंक्शन का इनपुट उस फ़ंक्शन के लिए मान्य सीमा से बाहर है (जैसे कि एक नकारात्मक संख्या के लिए std::sqrt)।
डेव एस

future_errorवायदा पर विभिन्न कार्यों द्वारा फेंका गया है जब अनुरोधित ऑपरेशन अमान्य है या ऑब्जेक्ट को अमान्य स्थिति में डाल देगा। यह C ++ 11 में नया सामान है, और मैं एक टिप्पणी में एक ट्यूटोरियल फिट नहीं कर सकता।
पीट बेकर

3
cppreference सूचियों में से व्युत्पन्न वर्ग std::exception, और नोटों कि क्या वे सी ++ 11 (विशेष रूप से, कर रहे हैं std::ios_base::failureसे ले जाया std::exceptionकरने के लिए std::system_error)। उपयोग और हेडर एक लिंक दूर हैं।
इकतारा

50

इस साइट को देखें

यहां छवि विवरण दर्ज करें

Exception               Description
===================================
std::exception          An exception and parent class of all the standard C++ exceptions.
std::bad_alloc          This can be thrown by new.
std::bad_cast           This can be thrown by dynamic_cast.
std::bad_exception      This is useful device to handle unexpected exceptions in a C++ program
std::bad_typeid         This can be thrown by typeid.
std::logic_error        An exception that theoretically can be detected by reading the code.
std::domain_error       This is an exception thrown when a mathematically invalid domain is used
std::invalid_argument   This is thrown due to invalid arguments.
std::length_error       This is thrown when a too big std::string is created
std::out_of_range       This can be thrown by the at method from for example a std::vector and std::bitset<>::operator[]().
std::runtime_error      An exception that theoretically can not be detected by reading the code.
std::overflow_error     This is thrown if a mathematical overflow occurs.
std::range_error        This is occured when you try to store a value which is out of range.
std::underflow_error    This is thrown if a mathematical underflow occurs.

यह अच्छा है, लेकिन C ++ 11 अपवादों को याद नहीं कर रहा है, और यह नहीं दिखाता है कि कौन से अपवाद किस हेडर में हैं।
मूइंग डक

3
@MooDDuck में आपके प्रश्न को टैग किया गया था c++, नहीं c++11, और वे सभी एक ही में रहते हैं<stdexcept>
TemplateRex

6
C ++ का अर्थ है जो भी नवीनतम संस्करण है, जबकि C ++ 11 और C ++ 03 उन विशिष्ट संस्करणों के बारे में प्रश्न हैं । मेरा प्रश्न किसी विशिष्ट संस्करण के बारे में नहीं है, बस C ++ की सबसे नवीनतम जानकारी है। किसी भी तरह से, मैं C ++ 11 का उल्लेख करने के लिए प्रश्न को संपादित करूंगा। इसके अलावा, उन सभी त्रुटियों में से एक के <stdexcept>रूप में ideone.com/uqM6h
डक

1
@MooDDuck यदि विशेष रूप से नहीं पूछा जाता है, तो C ++ 03 के लिए एक उत्तर C ++ 11 के लिए मान्य है और इसके विपरीत। सभी आवश्यक जानकारी प्रदान करना आपकी जिम्मेदारी थी। आपको कभी भी खराब प्रश्न से गुणवत्ता उत्तर प्राप्त करने की उम्मीद नहीं करनी चाहिए। अवधि।
फिल 1970

std::logic_error, नहीं std::logic_failure। वह आरेख गलत है!
गैलेक्सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.