2010-06-19 16 views
27

मेरे पास कुछ प्रोग्राम है और हर बार जब मैं इसे चलाता हूं, तो यह अपवाद फेंकता है और मुझे नहीं पता कि यह वास्तव में कैसे फेंकता है यह जांचने के लिए, इसलिए मेरा सवाल है, क्या अपवाद पकड़ना संभव है और यह अग्रिम धन्यवाद (मैं पंक्तियों जो अपवाद फेंकता पाया जाता है) को मुद्रितअज्ञात अपवाद को कैसे पकड़ें और इसे प्रिंट करें

उत्तर

32

यह std::exception से निकला है, तो आप संदर्भ द्वारा पकड़ कर सकते हैं:

try 
{ 
    // code that could cause exception 
} 
catch (const std::exception &exc) 
{ 
    // catch anything thrown within try block that derives from std::exception 
    std::cerr << exc.what(); 
} 

लेकिन अगर अपवाद कुछ वर्ग है कि std::exception से प्राप्त नहीं है, आपको इसके समय से पहले जानना होगा (यानी आपको std::string यापकड़ना चाहिए)।

आप एक पकड़ने सब कर सकते हैं:

try 
{ 
} 
catch (...) 
{ 
} 

लेकिन फिर आप अपवाद के साथ कुछ नहीं कर सकते।

+0

@ आर सैमुअल क्लैचको: बहुत धन्यवाद, एक और सवाल, क्या मैं आपके विधि का उपयोग नए के अपवादों को हटा सकता हूं और हटा सकता हूं? – helloWorld

+0

@helloWorld - हां, यह 'नए', 'हटाएं' और उनके द्वारा बुलाए गए किसी भी कन्स्ट्रक्टर या विनाशक को अपवादों को पकड़ लेगा (बशर्ते 'नया 'या' हटाएं 'कथन' try' block 'के भीतर है)। –

+3

अगर std :: अपवाद से अपवाद नहीं लिया गया है तो मुझे अपनी समस्या का निवारण कैसे करना चाहिए? – javapowered

1

आर सैमुअल क्लैचको द्वारा सुझाए गए अनुसार प्रयास करें। अगर इससे मदद नहीं मिलती है, तो कुछ और मदद कर सकता है जो मदद कर सकता है:

ए) यदि आपका डीबगर इसका समर्थन करता है तो अपवाद प्रकार (हैंडल या अनचाहे) पर ब्रेकपॉइंट रखें।

बी) कुछ प्रणालियों पर, कंपाइलर एक फेंक कथन निष्पादित होने पर एक कॉल (अनियंत्रित?) फ़ंक्शन उत्पन्न करता है। यह पता लगाने के लिए कि आपके सिस्टम के लिए कौन सा फ़ंक्शन है, एक सरल हैलो वर्ल्ड प्रोग्राम लिखें, जो एक अपवाद फेंकता है और पकड़ता है। एक डीबगर शुरू करें और अपवाद कन्स्ट्रक्टर में ब्रेकपॉइंट रखें, और इसे कहां से बुलाया जा रहा है से देखें। कैलिंग फ़ंक्शन शायद __throw() जैसा कुछ है। इसके बाद, उस प्रोग्राम के साथ फिर से डीबगर शुरू करें जिसे आप डिबगी के रूप में जांचना चाहते हैं। उपर्युक्त कार्य (__throw या जो कुछ भी) पर ब्रेकपॉइंट रखें और प्रोग्राम चलाएं। जब अपवाद फेंक दिया जाता है, तो डीबगर बंद हो जाता है और आप यह जानने के लिए वहां क्यों हैं।

3

यदि आप जीसीसी या क्लैंग के लिए एबीआई का उपयोग करते हैं तो आप अज्ञात अपवाद प्रकार को जान सकते हैं। लेकिन यह गैर मानक समाधान है।

यहाँ https://stackoverflow.com/a/24997351/1859469

11

सी ++ 11 में देखें आपके पास: साइट से std::current_exception

उदाहरण कोड:

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

void handle_eptr(std::exception_ptr eptr) // passing by value is ok 
{ 
    try { 
     if (eptr) { 
      std::rethrow_exception(eptr); 
     } 
    } catch(const std::exception& e) { 
     std::cout << "Caught exception \"" << e.what() << "\"\n"; 
    } 
} 

int main() 
{ 
    std::exception_ptr eptr; 
    try { 
     std::string().at(1); // this generates an std::out_of_range 
    } catch(...) { 
     eptr = std::current_exception(); // capture 
    } 
    handle_eptr(eptr); 
} // destructor for std::out_of_range called here, when the eptr is destructed 
0

Dawid Drozd जवाब से प्रेरित होकर:

इस शीर्ष लेख शामिल #include <exception>

try 
{ 
    // The code that could throw 
} 
catch(...) 
{ 
    auto expPtr = std::current_exception(); 

    try 
    { 
     if(expPtr) std::rethrow_exception(expPtr); 
    } 
    catch(const std::exception& e) //it would not work if you pass by value 
    { 
     std::cout << e.what(); 
    } 
} 
संबंधित मुद्दे