2012-01-03 5 views
13

कोड जो मैं अपने अपवाद हैंडलर में निष्पादित करना चाहता हूं वह स्वयं अपवाद फेंक सकता है।नेस्टेड कोशिश करें ... सी ++ अपवाद हैंडलर के अंदर पकड़ें?

अनुवर्ती संरचना कानूनी सी ++ है? यदि हां, क्या कोई डाउनसाइड्स हैं?

try 
{ 
    // ... 
} 
catch (const E&) 
{ 
    try 
    { 
     // ... 
    } 
    catch (const F&) 
    { 

    } 
} 
+0

हां, यह पूरी तरह से मान्य है। – Anand

उत्तर

15

नहीं, कोई डाउनसाइड्स नहीं हैं। इस तरह आपको यह करना चाहिए।

4

यह कोड का एक बिल्कुल मान्य तरीका है।

#include <iostream> 
using namespace std; 



int main(int argc, char* argv[]) 
{ 
     try  //outer try{} 
     { 
       try //inner try{} 
       { 
        throw std::runtime_error("Demo"); 
       } 
       catch (std::runtime_error& e) 
       { 
        std::cerr << "Inner Exception-Handler: " << e.what() << std::endl; 
        throw; 
       } 
     } 
     catch (std::exception& e) 
     { 
      std::cerr << "Outer Exception-Handler: " << e.what() << std::endl; 
     } 

    return 0; 
} 
17

वास्तव में, नेस्टेड ट्राई/कैच-ब्लॉक का उपयोग करने के लिए भी एक दिलचस्प तकनीक है: मान आप एक से अधिक कार्य करता है जो प्रभावी रूप से एक ही अपवाद संचालन की जरूरत है। विशेष रूप से जब एक और इंटरफेस लपेटना यह आम परिदृश्य है। इस मामले में यह, सभी अपवादों को पकड़ने के अपवाद संचालक से एक समारोह कहते हैं, और इस समारोह में वास्तविक अपवाद हैंडलिंग लागू करने के लिए अपवाद rethrow करना संभव है:

void fancy_handler() { 
    try { 
     throw; // assumes that fancy_handler() is called from catch-clause 
    } catch (std::runtime_error const& rt) { 
     std::cout << "runtime-error: " << ex.what() << "\n"; 
    } catch (std::exception const& ex) { 
     std::cout << "excption: " << ex.what() << "\n"; 
    } catch (...) { 
     std::cout << "unknown exception\n"; 
    } 
} 

void foo() { try { do_foo(); } catch (...) { fancy_handler(); } } 
void bar() { try { do_bar(); } catch (...) { fancy_handler(); } } 

मैं बस से परहेज नकल प्यार [गैर तुच्छ] कोड!

+0

प्रतीक्षा करें, क्या आप वास्तव में नेस्टेड फ़ंक्शन से 'फेंक सकते हैं'? मैंने कभी ऐसी बात नहीं देखी है! –

+1

@MooingDuck: जब तक आप एक कैच-ब्लॉक से फ़ंक्शन कहलाते हैं, तो आप अपवाद को फिर से निकाल सकते हैं। और भी दिलचस्प बात यह है कि यह जावा और सी # में भी काम करता है (मैंने जावा में मूल रूप से विभिन्न डेटाबेस अपवादों की एक बड़ी संख्या से निपटने के लिए इस तकनीक का उपयोग किया; मैं सी ++ विशेषज्ञ जावा विशेषज्ञ नहीं था, हालांकि; –

+0

मैं मानक में देखना और विवरण, और कोनों को सीखना है। –