2015-02-16 6 views
13

मेरे पास एक कोशिश पकड़ने का प्रयास है जहां बाहरी catch(...) अब तक कभी नहीं हुआ। कुछ बदलावों के बाद, कहीं अपवाद जो मैं अन्य मामलों के साथ संभाल नहीं पाता हूं। क्या मुझे अपवाद के बारे में कम से कम कुछ जानकारी प्राप्त करने का कोई तरीका है, भले ही मैं इसे (...) से पकड़ूं?कैच (...) के साथ पकड़े गए अपवाद से कुछ जानकारी प्राप्त करें?

catch (const cone::BeginnersLibException& ex) 
{ 
    // handle the exception 
} 
catch (const std::exception& ex) 
{ 
    // handle std exception 
} 
catch (...) 
{ 
    log("Unknown exception caught."); 
    // How can I get more information about this exception? 
} 

संपादित करें: यहाँ एक कोड का टुकड़ा है कि मेरे लिए काम करता है:

#include <cxxabi.h> 

// more code here 
} catch (...) { 
    std::string exName(abi::__cxa_current_exception_type()->name()); 
    std::cout<<"unknown exception: "<< exName <<std::endl; 
    throw; 
} 
+0

यदि कोई अपवाद 'std :: अपवाद' से प्राप्त होता है, तो आप 'पकड़ (कॉन्स std :: अपवाद और exc)' कह सकते हैं और फिर 'exc.what()' – Mints97

+1

@ Mints97 का उपयोग कर सकते हैं: निश्चित रूप से, लेकिन यह ओपी नहीं है परिस्थिति। –

+0

इसमें कोड स्निपेट – Niall

उत्तर

15

आप इस gdb या किसी अन्य डिबगर का उपयोग कर सकते हैं। किसी अपवाद को फेंकने पर डीबगर को रोकने के लिए कहें (gdb में कमांड catch throw है)। फिर आप न केवल अपवाद के प्रकार को देखेंगे, लेकिन यह कहां से आ रहा है।

एक और विचार catch (...) पर टिप्पणी करना है और अपना रनटाइम आपके आवेदन को समाप्त करने दें और उम्मीद है कि आप अपवाद के बारे में और बताएंगे।

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

यदि आप जीसीसी या क्लैंग का उपयोग करते हैं तो आप वर्तमान अपवाद प्रकार का नाम प्राप्त करने के लिए __cxa_current_exception_type()->name() भी आजमा सकते हैं।

+1

मुझे cxxabi शामिल करना था। एच – Beginner

+1

+1 '__cxa_current_exception_type() -> name()' के लिए +1। चूंकि अपवाद का निरीक्षण करने के लिए कोई भाषा समर्थन नहीं है, इसलिए विक्रेता- और प्लेटफ़ॉर्म-विशिष्ट एक्सटेंशन जाने का एक व्यावहारिक तरीका है। – mskfisher

+0

कृपया इस उत्तर को https://stackoverflow.com/questions/1055299/is-there-any-way-to-get-some-information-at-least-for-catch; यह है वही सवाल, लेकिन आपका उत्तर उन विकल्पों को प्रदान करता है जो वहां दिखाई नहीं दे रहे हैं। – zwol

5

जॉन Zwinck के सुझाव पर एक प्रकार बाहर टिप्पणी करने के लिए catch(...) ब्लॉक रन-टाइम अनुप्रयोग को समाप्त और उम्मीद है कि कुछ और अधिक जानकारी प्रदान करने देने के लिए के रूप में, आप

catch (...) 
{ 
    log("Unknown exception caught in [sensible info here]; will rethrow it"); 
    throw; 
} 

तो आप कम से कम पता चल जाएगा सकता है जहां में आपके कार्यक्रम में त्रुटि हुई (यदि कई संभावनाएं हैं)।

2

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

2

आप डीबगर का उपयोग कर सकते हैं और फेंकने पर ब्रेक सक्षम कर सकते हैं, मानते हैं कि आपके अपवाद वास्तव में असाधारण हैं, यह जानने का एक अच्छा तरीका है कि यह कहां से आ रहा है।

इसके अलावा चेतावनी का एक शब्द आपको कभी भी खिड़कियों पर पकड़ (...) का उपयोग करना चाहिए। कुछ निर्माण विकल्पों के तहत यह एसईएच अपवादों को पकड़ लेगा, ये ऐसी चीजें हैं जिन्हें आपको कभी भी हैंडल का प्रयास नहीं करना चाहिए जैसे कि सीमाओं से स्मृति को पढ़ना या लिखना।

2

catch(...) ब्लॉक में अपवाद से जानकारी प्राप्त करने के लिए कोड में एकमात्र तरीका (यानी डीबगर का उपयोग नहीं कर रहा है) अपवाद को पुनर्स्थापित करना है, और इसे विशिष्ट खंडों से पकड़ना है।

उदाहरण के लिए

try 
{ 
    // code that might throw something 
} 
catch (...) 
{ 
    try_to_interpret_exception(); 
} 

void try_to_interpret_exception() // we assume an exception is active 
{ 
    try 
    { 
     throw; // rethrow the exception. Calls terminate() if no exception active 
    } 
    catch (std::exception &) 
    { 
     // handle all exception types derived from std::exception 
     // this covers all exceptions that might be thrown by 
     // the standard C++ library 
    } 
    catch (specific_exception &e1) 
    { 
     // handle all exception types derived from specific_exception 
    } 
    catch (another_specific_exception &e2) 
    { 
     // etc 
    } 
} 

(तो बात करने के लिए) इस दृष्टिकोण की पकड़ है कि यह प्रोग्रामर की आवश्यकता है क्या अपवाद हो सकता है (एक तीसरी पार्टी पुस्तकालय के प्रलेखन से उदा) के कुछ ज्ञान है। |

+0

समस्या यह है कि अपवाद किसी एक libs से आ रहा है और मुझे नहीं पता कि क्या पकड़ना है। – Beginner

+0

पुस्तकालयों के लिए प्रलेखन (या स्रोत कोड यदि आपके पास है) का एकमात्र वास्तविक समाधान है। अपने प्रोग्राम से एक समय में एक लाइब्रेरी को हटा दें जब तक आप आवश्यक पुस्तकालय को अपमानित नहीं करते हैं। असल में, हालांकि, इस स्थिति को सबसे अच्छी तरह से टाला जा सकता था (उदाहरण के लिए एक उत्पादन कार्यक्रम में शामिल करने से पहले पुस्तकालय का मूल्यांकन करके)। पुस्तकालय विक्रेता द्वारा फेंक दिया अपवाद दस्तावेज वास्तव में खराब रूप नहीं है। – Rob

+0

माइनर नाइटपिक: आप जेनेरिक को सबसे विशिष्ट अपवाद प्रकार से जाना चाहते हैं, न कि दूसरी तरफ 'राउंड। कुछ अपवाद पदानुक्रम 'std :: अपवाद', या 'std :: runtime_error' से प्राप्त होते हैं (जैसा वह है '.what()' play में आता है)। यदि आप इसे पहले पकड़ते हैं, तो आप इससे अधिक प्रभावित हो सकते हैं। – DevSolar

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