2010-06-28 20 views
18

अगर मैं किसी फ़ाइल को उपयोगी जानकारी लिखना चाहता हूं, जब भी मैं पकड़ लेता हूं-सभी अपवाद, इसे कैसे करें?कैच-अपवाद का संदेश कैसे प्राप्त करें

try 
{ 
    //call dll from other company 
} 
catch(...) 
{ 
    //how to write info to file here??????? 
} 
+2

आप अपवाद से बाहर निकलना चाहते हैं? क्या होगा यदि ऑब्जेक्ट फेंक दिया गया है तो 'int' है? जब आप पकड़ते हैं (...) ', आपको नहीं पता कि पकड़ा गया अपवाद * एक संदेश होगा। – jalf

+0

इस प्रश्न ने मुझे एक अजीब विचार दिया (यह काम नहीं करेगा, लेकिन यह एक मजेदार बात होगी यदि यह किया गया था): टेम्पलेट पकड़ो (कॉन्स टी और पूर्व) {...} मुझे नहीं लगता कि यह संभवतः काम कर सकता है अपवाद एक रनटाइम तंत्र से अधिक हैं ... या यह हो सकता है? एक अपवाद फेंकने और सही पकड़ ब्लॉक में ब्रांच करने में शामिल स्टैक अनचाहे तंत्र बस मुझे जादू की तरह लगते हैं। शायद शाखा में सही पकड़ ब्लॉक अभी भी संकलन-समय पर निर्धारित है, जो मॉड्यूल सीमाओं में फेंकने के लिए असुरक्षित कारणों में से एक कारण बताएगा। – stinky472

उत्तर

43

आपको पकड़ने की ब्लॉक से कोई जानकारी नहीं मिल सकती है। यही कारण है कि कोड आमतौर पर इस तरह अपवाद संभालती है:

try 
{ 
    // do stuff that may throw or fail 
} 
catch(const std::runtime_error& re) 
{ 
    // speciffic handling for runtime_error 
    std::cerr << "Runtime error: " << re.what() << std::endl; 
} 
catch(const std::exception& ex) 
{ 
    // speciffic handling for all exceptions extending std::exception, except 
    // std::runtime_error which is handled explicitly 
    std::cerr << "Error occurred: " << ex.what() << std::endl; 
} 
catch(...) 
{ 
    // catch any other errors (that we have no information about) 
    std::cerr << "Unknown failure occurred. Possible memory corruption" << std::endl; 
} 
6

पकड़ने वाले सभी हैंडलर में विशिष्ट अपवाद के बारे में कुछ भी जानने का कोई तरीका नहीं है। यह सबसे अच्छा है यदि आप बेस क्लास अपवाद पर पकड़ सकते हैं, जैसे कि std :: अपवाद, यदि संभव हो तो।

1

मैं वह यह लॉग इन करें कि कोई त्रुटि आ बनाने के लिए चाहता है, लेकिन विशेष रूप से सटीक त्रुटि की जरूरत नहीं है (वह उस मामले में अपने ही त्रुटि पाठ लिखते थे लगता है)।

ऊपर पोस्ट किए गए लिंक डंबकोडर में ट्यूटोरियल पर है जो आपको प्राप्त करने का प्रयास करने में आपकी सहायता करेगा।

3

आपको कोई विवरण नहीं मिल सकता है। catch(...) का पूरा बिंदु ऐसा है कि "मुझे नहीं पता कि क्या हो सकता है, इसलिए जो भी फेंक दिया गया है उसे पकड़ें"। catch 'ज्ञात अपवाद प्रकारों के लिए आप आमतौर पर catch(...) डालते हैं।

8

फ़ंक्शन std :: current_exception() द्वारा पकड़ा गया अपवाद सुलभ है, जिसे < अपवाद > में परिभाषित किया गया है। यह सी ++ 11 में पेश किया गया था।

std::exception_ptr current_exception(); 

हालांकि, std :: exception_ptr ताकि आप विवरण के लिए वैसे भी नहीं मिल सकता है, एक कार्यान्वयन से परिभाषित प्रकार है। typeid(current_exception()).name() आपको अपवाद अपवाद नहीं, अपवाद_पीआरआर बताता है। तो केवल एक चीज के बारे में आप इसके साथ कर सकते हैं std :: rethrow_exception() है। (यह फ़ंक्शन थ्रेड में कैच-पास-एंड-रीथ्रो मानकीकृत करने के लिए प्रतीत होते हैं।)

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