2010-02-18 17 views
9

यहां सेटअप है।यदि मैं "फेंक" का उपयोग करता हूं तो क्या होता है फेंकने के अपवाद के बिना?

मैं एक सी ++ प्रोग्राम है जो कई कार्य कहता है, जो सभी के संभावित एक ही अपवाद सेट फेंक है, और मैं एक समारोह में अपवाद के लिए समान व्यवहार जैसे प्रिंट त्रुटि संदेश & चाहते (डिफ़ॉल्ट करने के लिए सभी डेटा को रीसेट अपवाद के लिए; बस अपवाद के लिए प्रिंट करें; अन्य सभी अपवादों के लिए साफ़ रूप से बंद करें)।

ऐसा लगता है जैसे मैं एक निजी समारोह जो केवल त्रुटि rethrows कॉल करने के लिए पकड़ व्यवहार स्थापित करने के लिए सक्षम होना चाहिए, और इसलिए की तरह कैच करता है,:

void aFunction() 
{ 
    try{ /* do some stuff that might throw */ } 
    catch(...){handle();} 
} 

void bFunction() 
{ 
    try{ /* do some stuff that might throw */ } 
    catch(...){handle();} 
} 

void handle() 
{ 
    try{throw;} 
    catch(anException) 
    { 
     // common code for both aFunction and bFunction 
     // involving the exception they threw 
    } 
    catch(anotherException) 
    { 
     // common code for both aFunction and bFunction 
     // involving the exception they threw 
    } 
    catch(...) 
    { 
     // common code for both aFunction and bFunction 
     // involving the exception they threw 
    } 
} 

अब, क्या हुआ अगर होता "संभाल" अपवाद वर्ग के बाहर कहा जाता है। मुझे पता है कि यह कभी नहीं होना चाहिए, लेकिन मुझे आश्चर्य है कि व्यवहार C++ मानक द्वारा अपरिभाषित है या नहीं।

+0

इसे समाप्त कर दिया जाता है, लेकिन आप मुझे क्या करना चाहते हैं ?, इस प्रोग्राम को निष्पादित करने के लिए आपको एक कंपाइलर प्रदान करता है ताकि आप परिणाम सत्यापित कर सकें। –

+0

सभी संकलक इसे संकलित करेंगे। और यह संकलित होगा, क्योंकि किसी उपयोगकर्ता को चेतावनी देने के लिए हैंडल की * परिभाषा * के बारे में कुछ भी नहीं है कि उसे निश्चित रूप से लोड अपवाद की आवश्यकता होगी। कंपाइलर आपको अपरिभाषित व्यवहार के बारे में बहुत उपयोगी नहीं बता सकते हैं, विशेष रूप से ऐसा कुछ जो रन-टाइम तक नहीं उठाया जाएगा। – deworde

उत्तर

16

यदि handle() को अपवाद के संदर्भ के बाहर बुलाया जाता है, तो आप बिना किसी अपवाद के throw करेंगे। इस मामले में, मानक (अनुभाग 15.5.1 देखें) निर्दिष्ट करता है कि वर्तमान में कोई अपवाद नहीं संभाला जा रहा है

हैं, तो एक throw-expression क्रियान्वित नहीं संकार्य के साथ कॉल terminate()

इसलिए आपका आवेदन समाप्त हो जाएगा। शायद यह नहीं है कि आप यहां क्या चाहते हैं।

+0

ठीक है, यदि आप कैच ब्लॉक के अंदर नहीं हैं, तो "हैंडल()" को कॉल करने के लिए कोई सौहार्दपूर्ण कारण नहीं है, लेकिन मुझे इसमें दिलचस्पी थी कि क्या हुआ था। यह एक सही उत्तर था। धन्यवाद! – deworde

5

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

+0

अच्छा जवाब, हालांकि जॉन स्पष्ट था। धन्यवाद! – deworde

1

कभी भी कभी भी कैच (...) का उपयोग न करें क्योंकि आप उन अनुप्रयोग त्रुटियों को पकड़ सकते हैं जिन्हें आप पकड़ना नहीं चाहते हैं, उदा। बग, एक्सेस उल्लंघन (आप कैसे संकलित करते हैं) के आधार पर।

महान जॉन रॉबिन्स पुस्तक (विंडोज अनुप्रयोगों को डिबगिंग) पढ़ें जिसमें वह विस्तार से बताता है कि आपको ऐसा क्यों नहीं करना चाहिए।

+0

http://stackoverflow.com/questions/2183113/using-catch-ellipsis-for-post-mortem-analysis –

+2

यह मेरे प्रश्न के लिए पूरी तरह से अप्रासंगिक है। इसके अलावा, यह गलत है, जैसा ऊपर दिखाया गया एसएफ है। जब तक आप इसे सही तरीके से संभालते हैं, तब तक (...) का उपयोग करने के बहुत सारे अच्छे कारण हैं। उदाहरण के लिए, मान लीजिए कि मैं साझा की गई किसी चीज़ पर लॉक जारी करना चाहता हूं। मैं एक विनाशक तक पहुंचने तक इंतजार कर सकता था, लेकिन जैसे ही मुझे यकीन है कि इसे अब करने की ज़रूरत है मुझे अब इसकी आवश्यकता नहीं है। मैं फिर पकड़ (...) {} ब्लॉक के अंदर से फिर से उड़ा सकता हूं अगर मैं यह सुनिश्चित करना चाहता था कि एक्सेस उल्लंघन और बग अभी भी समाप्त हो गए हैं। – deworde

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

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