2010-02-23 2 views
6

संभव डुप्लिकेट:
Determining exception type after the exception is caught?मैं कैच (...) ब्लॉक में वर्तमान अपवाद कैसे निर्धारित कर सकता हूं?

इस question पर के बाद, मैं एक पकड़ (...) ब्लॉक में बाहर वर्तमान अपवाद प्रिंट करना चाहते हैं - बस लॉगिंग के लिए। एक जवाब का कहना है ऐसा करने का कोई मानक तरीका है कि वहाँ है, लेकिन मैं नहीं() :-)

current_exception एक जवाब के लिए ले जा रहा एक समारोह वेब पर लेकिन जाहिरा तौर पर नहीं विभिन्न स्थानों में उल्लेख किया है पसंद नहीं है अच्छी तरह से समर्थन किया। इस पर कोई विचार? आखिरकार, सी में भी त्रुटि है।

क्योंकि इसे पुनर्स्थापित किया जा सकता है (एक साधारण ** फेंक * के साथ), अपवाद वस्तु किसी भी तरह उपलब्ध होनी चाहिए।

मैं एमएसवीएस 9.0 का उपयोग कर रहा हूं।

संपादित करें: निष्कर्ष ऐसा लगता है कि यह संभव नहीं है।

+4

मुझे नहीं पता कि यह प्रश्न आपके द्वारा संदर्भित एक से अलग है। सिर्फ इसलिए कि आपको जवाब पसंद नहीं है फिर से पूछने का कोई कारण नहीं है। –

+0

मैं मार्क से सहमत हूं। लेकिन, शायद आपको एहसास नहीं है कि आप सभी सामान्य अपवादों के आधार वर्गों को पकड़ने के लिए स्वीकार किए गए उत्तर की तकनीक का उपयोग कर सकते हैं, जैसे std :: अपवाद और एमएफसी को पकड़ना जिसे सीईएक्सप्शन * के रूप में पकड़ा जा सकता है। –

+0

प्रश्न थोड़ा अलग है: दूसरा अपवाद के प्रकार की पहचान करने के बारे में पूछता है, जबकि यह अपवाद के बारे में जितना संभव हो उतना अधिक जानकारी प्रिंट करना चाहता है। –

उत्तर

0

आप आरटीटीआई चालू कर सकते हैं और टाइपऑफ फ़ंक्शन का उपयोग कर सकते हैं। current_exception पूरी तरह से एसटीएल समारोह है, और केवल एसटीएल अपवादों पर लागू होता है।
एक सिफारिश के रूप में, प्रति अपवाद प्रकार के विभिन्न catch(exctype) का उपयोग करें। यह जीवन को बहुत आसान बना देगा।

+2

'पकड़ (...) 'आपको संदर्भ के लिए एक वस्तु नहीं देता है, इसलिए आप इस प्रकार को नहीं जान सकते हैं। और आरटीटीआई पीओडी प्रकारों पर काम करता है, जैसे int? –

1

एलेजेरस की तरह पहले ही कहा गया है: current_exception केवल stl अपवादों के लिए काम करता है। विभिन्न एसटीएल त्रुटियों आप भी लिख सकते हैं पाने के लिए:

#include <stdexcept> 
#include <exception> //ecxeption (base class) 
#include <new>  //bad_alloc 
#include <typeinfo> //bad_cast und bad_typeid 
#include <ios>  //ios_base::failure  

... 

try 
{ 
    ... 
} 
catch(std::exception& e) 
{ 
    cerr<<"Error: "<<e.what()<<endl; 
} 
1

निर्धारित करें कि अपवाद फेंक दिया जा सकता है और आम आधार प्रकार का एक सेट उन सब को शामिल किया गया है कि पकड़ने के लिए पकड़ संचालकों का एक सेट का उपयोग करें।


पकड़ से अपवाद वस्तु (...), यह portably नहीं किया जा सकता और जहाँ तक मुझे पता है, यह सभी Microsoft संकलक या जीसीसी का उपयोग करने में नहीं किया जा सकता प्राप्त करने के लिए के रूप में। क्या आपको लगता है कि अपवाद ऑब्जेक्ट अभी भी कैच (...) हैंडलर में मौजूद है?

+2

> "आपको क्या लगता है कि अपवाद ऑब्जेक्ट अभी भी कैच (...) हैंडलर में मौजूद है?" क्योंकि इसे पुनर्स्थापित किया जा सकता है (एक साधारण "फेंक" के साथ), वस्तु कहीं कहीं होनी चाहिए। –

+0

यदि पकड़ (...) शीर्ष स्तर पकड़ने वाला हैंडलर है? As-if नियम कंपाइलर को ऑब्जेक्ट को नष्ट करने के लिए अधिकृत होगा जब भी सुविधाजनक/सुविधाजनक था। मुझे संदेह है कि हालांकि अभ्यास में होता है। –

7

यदि आप केवल कोड लिखते समय अपवादों की परवाह करते हैं तो आप एक हैंडलर लिख सकते हैं जो सभी 'ज्ञात' अपवादों से निपट सकता है। चाल अपवाद है कि आप catch(...) साथ पकड़ा और उसके बाद विभिन्न ज्ञात अपवाद को पकड़ने ... rethrow है

तो, कुछ की तरह:

bool LogKnownException() 
{ 
    try 
    { 
     throw; 
    } 
    catch (const CMyException1 &e) 
    { 
     cerr << "caught a CMyException: " << e << endl; 

     return true; 
    } 
    catch (const Blah &e) 
    { 
     ... 
    } 
    ... etc 

    return false; 
} 
:

try 
{ 
... 
} 
catch(...) 
{ 
    if (!LogKnownException()) 
    { 
     cerr << "unknown exception" << endl; 
    } 
} 

जहां LogKnownException() कुछ इस तरह दिखता

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