2011-08-06 21 views
20

निम्नलिखित सी ++ कोड पर विचार करें:कैच ब्लॉक में फेंक दिया अपवाद बाद में पकड़ ब्लॉक द्वारा पकड़ा जाएगा?

try { 
    throw foo(1); 
} catch (foo &err) { 
    throw bar(2); 
} catch (bar &err) { 
    // Will throw of bar(2) be caught here? 
} 

मैं उम्मीद होती है इस सवाल का जवाब यह क्योंकि कोई try ब्लॉक के अंदर नहीं है और मैं एक और सवाल जवाब जावा के लिए नहीं है में देखते हैं, लेकिन सी की पुष्टि करना चाहते ++ भी है नहीं। हां, मैं एक परीक्षण कार्यक्रम चला सकता हूं, लेकिन मैं दूरस्थ मामले में व्यवहार की भाषा परिभाषा जानना चाहता हूं कि मेरे कंपाइलर में एक बग है।

उत्तर

21

नं। try ब्लॉक में केवल अपवादों को फेंक दिया जा सकता है catch ब्लॉक द्वारा पकड़ा जा सकता है।

7

नहीं, यह नहीं होगा, पदानुक्रम ऊपर एक संलग्न पकड़ ब्लॉक इसे पकड़ने में सक्षम होगा।

नमूना उदाहरण:

void doSomething() 
{ 
    try 
    { 
     throw foo(1); 
    } 
    catch (foo &err) 
    { 
     throw bar(2); 
    } 
    catch (bar &err) 
    { 
     // Will throw of bar(2) be caught here? 
     // NO It cannot & wont 
    } 
} 

int main() 
{ 
    try 
    { 
     doSomething(); 
    } 
    catch(...) 
    { 
     //Catches the throw from catch handler in doSomething() 
    } 
    return 0; 
} 
+1

को अपवाद प्रतिनिधिमंडल द्वारा वांछित व्यवहार को प्राप्त हो सकता है जवाब में सुधार करना चाहिए कि 'बार (2)' पकड़ गुट में पकड़ा हो जाएगा 'मुख्य() 'फ़ंक्शन में k। इससे उत्तर अधिक स्पष्ट हो जाएगा। – zar

2

नहीं, एक कैच ब्लॉक, निकटतम अपवाद संभालती है, इसलिए यदि आप कोशिश ... पकड़ (अपवाद & exc) ... पकड़ (SomethingDerived & derivedExc) अपवाद नहीं होगा & exc ब्लॉक में संभाला

आप बुला विधि

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