2010-06-24 30 views
9

क्या यह किसी भी तरह से return पर throw अपवाद के बाद एक मूल्य है? यदि नहीं, तो return कथन छोड़ दिया जा सकता है और क्या यह किसी भी तरह संकलक त्रुटि C4715: not all control paths return a value को हटाने के लिए संभव है?अपवाद फेंकने के बाद लौटने

अग्रिम धन्यवाद।

संपादित करें: (नमूना कोड)

for (ushort i = 0; i < itsNumUnits; ++i) 
    if (unitFormation[i] == unit) 
    { 
     return unitSetup[i]; 
    } 
    else 
     throw unit; 

return 0; 
+2

यदि आपके दिनचर्या में अंतिम विवरण एक 'फेंक' है और आपको अभी भी एक चेतावनी मिल रही है, तो आपको एक कोड नमूना पोस्ट करना चाहिए और कहें कि आप किस कंपाइलर का उपयोग कर रहे हैं। –

+0

मेरे मन में जो कुछ था, वह इस तरह से कुछ था जो मैंने प्रश्न में जोड़ा था ... क्षमा करें पहले नमूना नहीं जोड़ा था। –

+0

कंपाइलर चेतावनी भाषा या मानक के साथ कोई समस्या नहीं है, लेकिन संकलक के साथ। मुझे लगता है कि आप त्रुटि संदेश के रूप से Visual C++ के कुछ संस्करण का उपयोग कर रहे हैं, लेकिन यह जानने में मदद कर सकता है कि कौन सा। –

उत्तर

7

अपवाद फेंक के बाद एक मूल्य के वापस जाने के लिए कोई जरूरत नहीं है। यदि आपके पास यह त्रुटि है, तो आपको अपवाद फेंकने के बिना आपके कोड को प्राप्त करने वाले पथों की जांच करनी चाहिए, उदा।

if (something) 
    throw Exception; 
else 
    return value; 

"अगर" की "और" शाखा में मान देने के लिए असफल एक संकलन त्रुटि का कारण है क्योंकि अपवाद या something के मूल्य के आधार फेंक दिया नहीं किया जा सकता हैं।

+3

एमएसवीसी सी 4715 देगा: सभी नियंत्रण पथ आपके कोड में पथ के लिए एक मान वापस नहीं करते हैं, भले ही यह पथ हमेशा से फेंकने के बाद वापस नहीं लौटा सकता है। – Pait

2

फेंक फंक्शन निष्पादन को समाप्त कर देता है। लेकिन यदि आपका फ़ंक्शन एक मान देता है, और अपवाद नहीं फेंक दिया जाता है, तो आपको एक मूल्य वापस करने का ख्याल रखना होगा। उदा।

bool foo(bool _flag) throw(...) 
{ 
    if (_flag) 
    { 
     throw "foo is throwing an exception"; 
    } 
    return true; 
} 
-1

फेंकने के बाद आप पकड़ने में समाप्त हो जाते हैं (नीचे दिए गए कोड को निष्पादित नहीं किया जाता है)। निष्पादित किया गया एकमात्र ब्लॉक अंततः है।

तुम क्या आप कुछ इस तरह के लिए ऊपर जाना वर्णित की तरह कुछ हासिल करना चाहते हैं, तो:

object returnVal = null; // the bad 
try 
{ 
    //some code here 
    throw new Exception(); // something bad happened 
    //some more code 
    returnVal = new object(); // the good 
} 
catch(Exception ex) 
{ 
    // log, try to recover etc. 
    // maybe it`s a good idea not to throw it away if you can handle it here! 
} 
return returnVal; // either the good or the bad (never the ugly!) 

चेतावनी के सी # बराबर एक संकलक त्रुटि है तो किसी भी तरह से मैं एक अच्छा विचार नहीं लगता कि संकलक चेतावनियों से छुटकारा पाने के लिए है लेकिन उन्हें हल करने की कोशिश करने के लिए है।

सादर ...

+0

सी ++ में कोई 'आखिरकार' नहीं है, और इस प्रश्न में अपवाद को पकड़ने का कोई उल्लेख नहीं है। और यदि संकलक बिना शर्त 'फेंक' के बाद 'वापसी' नहीं होने के कारण चेतावनी उत्पन्न कर रहा है, तो चेतावनी फर्जी है। –

+5

सी ++ के लिए बहुत खराब कोड, हमारे पास 'ऑब्जेक्ट', 'शून्य', या 'नया' नहीं है ... –

+0

यह वास्तव में सी # है लेकिन मुझे लगता है कि वहाँ एक समान स्तर का समानता भी है ... – Padel

0

में सक्षम होने के लिए निकटतम समकक्ष "वापसी" एक मूल्य के साथ ही फेंक जब समारोह अपवाद फेंकने से पहले एक सूचक को लिखते हैं या संदर्भित वस्तु एक अपवाद है करने के लिए:

void my_func(int& ret) 
{ 
    ret = 0; 

    for (ushort i = 0; i < itsNumUnits; ++i) { 
     if (unitFormation[i] == unit) { 
      ret = unitSetup[i]; 
      return; 
     } 
     else { 
      throw unit; 
     } 
    } 
} 

हालांकि, यह पैटर्न त्रुटि-प्रवण और शायद ही कभी उपयोगी है। इसका उपयोग करने से पहले सावधानी से सोचें।

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