2009-06-11 12 views
11

सी ++ throw; में जब कैच ब्लॉक के अंदर निष्पादित किया गया तो ब्लॉक के बाहर वर्तमान में पकड़े गए अपवाद को पुनर्स्थापित करता है।फेंकने पर क्या होता है; कैच ब्लॉक के बाहर कथन निष्पादित किया गया है?

this answer में अपवाद डिस्पैचर की एक विचार जब जटिल अपवाद संचालन अक्सर का उपयोग कर कोड दोहराव को कम करने के लिए एक समाधान के रूप में लाया जाता है:

try { 
    CodeThatMightThrow(); 
} catch(...) { 
    ExceptionHandler(); 
} 

void ExceptionHandler() 
{ 
    try { 
     throw; 
    } catch(FileException* e) { 
     //do handling with some complex logic 
     delete e; 
    } catch(GenericException* e) { 
     //do handling with other complex logic 
     delete e; 
    } 
} 

एक सूचक फेंकने या तो इसे बाहर है एक मूल्य कोई फर्क नहीं पड़ता सवाल का

क्या होता है यदि अपवाद हैंडलर() को कैच ब्लॉक से नहीं कहा जाता है?

int main(int, char**) 
{ 
    try { 
     throw; 
    } catch(...) { 
     MessageBox(0, "", "", 0); 
    } 
    return 0; 
} 

पहले यह एक प्रथम मौका अपवाद इंगित करने के लिए डिबगर का कारण बनता है, तो तुरंत एक बिना क्रिया का अपवाद:

मैं VC7 के साथ इस कोड की कोशिश की। अगर मैं डीबगर के बाहर यह कोड चलाता हूं तो प्रोग्राम उसी तरह दुर्घटनाग्रस्त हो जाता है जैसे abort() को कॉल किया गया है।

ऐसी परिस्थितियों के लिए अपेक्षित व्यवहार क्या है?

+0

"विंडोज़" टैग हटा दिया गया क्योंकि इसका विंडोज़ के साथ कुछ लेना देना नहीं है (लेकिन यह एक अच्छा सवाल है)। –

उत्तर

23

स्टैंडर्ड से, 15,1/8

कोई अपवाद नहीं वर्तमान में किया जा रहा है, तो कोई संकार्य के साथ एक फेंक अभिव्यक्ति क्रियान्वित कॉल std::terminate()।

+0

सिर्फ इसलिए कि ए) आपने मुझे इसे हराया, और बी) आपने मानक उद्धृत किया है, मैं अपना (लगभग) डुप्लिकेट उत्तर हटा दूंगा – Glen

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