2012-03-03 19 views
7

मैं केवल सी ++ सीख रहा हूं, और एक अपवाद फेंकना चाहता हूं, लेकिन फिर मेरे फ़ंक्शन का परिणाम अपरिभाषित होगा ???एक फंक्शन से अपवाद और वापसी परिणाम

std::vector<myStruct> extract_notworking(std::vector<myStruct>& avec){ 
     std::vector<myStruct> result; 

     if (avec.size() == 0) 
      //throw domain_error("Cannot operate on empty vector!"); 
      //Cannot use exception for it would yield undefined result 
      return result; 

     //do something here 
     //... 
     return result; 
    } 

मुझे क्या करना चाहिए? एक खाली वेक्टर लौटें? अगर मैं वापसी मूल्य के रिसीवर को अपवाद फेंक दिया तो क्या होगा?

+8

यदि आप कोई अपवाद फेंकते हैं, तो आपका फ़ंक्शन वापस नहीं आता है। यह पूरी बात है। –

+0

तो शायद मेरे कार्य को रद्द कर दें और मेरे वेक्टर के संदर्भ में एक और पैरामीटर जोड़ें? – Mihaela

+1

संभावित डुप्लिकेट [अपवाद फेंकने के बाद लौटने] [http://stackoverflow.com/questions/3109943/returning-after-throwing-exceptions) –

उत्तर

9

जब आप कोई अपवाद फेंकते हैं, तो फ़ंक्शन वहां रुक जाता है और जहां भी अपवाद पकड़ा जाता है वहां निष्पादन कूदता है। आपका फ़ंक्शन कुछ भी वापस नहीं करता है क्योंकि फ़ंक्शन बिल्कुल वापस नहीं आता है।

तुम बस

if (avec.empty()) 
    throw domain_error("Cannot operate on empty vector!"); 

कर सकते हैं और अपने कार्य वहाँ बाहर निकल जाएगा।

ध्यान दें कि आपको रिटर्न वैल्यू ("कोई फ़ंक्शन कुछ भी वापस नहीं कर सकता है?" आदि के बारे में चिंतित होने की आवश्यकता नहीं है क्योंकि आप फेंकने वाले फ़ंक्शन के रिटर्न वैल्यू तक नहीं पहुंच सकते (और पकड़ नहीं पाए) यदि आप कोशिश करते हैं तो भी एक अपवाद।

तो उदाहरण के लिए

, ठीक तरह से कार्य करता है, तो रिटर्न (अर्थात फेंक नहीं है) आप केवल retval उपयोग कर सकते हैं अगर आप

try { 
    std::vector<myStruct> vec; 

    std::vector<myStruct> retval = extract_notworking(vec); 

    print_vector(retval); // this line is only executed if extract_networking 
          // does not throw an exception 
} catch (const domain_error& e) { 
    // we can't access retval here so no worries 
} 

है। उदाहरण में, आपका फ़ंक्शन फेंक देगा क्योंकि vec खाली है, इसलिए print_vector कभी नहीं कहा जाएगा।

यहां तक ​​कि अगर आप ऐसा करते हैं:

std::vector<myStruct> retval; 

try { 
    std::vector<myStruct> vec; 

    retval = extract_notworking(vec); 

    print_vector(retval); 
} catch (const domain_error& e) { 
    // we can access retval here but the assignment never happened 
} 

के बाद से समारोह वापस नहीं किया था, retval करने के लिए अपनी वापसी मान का काम नहीं हुआ, और retval अभी भी एक पूरी तरह से सामान्य है डिफ़ॉल्ट-निर्माण vector है कि आप कर सकते हैं स्वतंत्र रूप से उपयोग करें। तो उस उदाहरण में, retval को असाइन नहीं किया गया है और retval मुद्रित नहीं किया गया है, क्योंकि extract_networking ने अपवाद फेंक दिया और निष्पादन catch ब्लॉक में उन दो चीजों के होने से पहले कूद गया।

+0

धन्यवाद, मैं अपवाद फेंक दूंगा, और इसे कॉलर में पकड़ूंगा। – Mihaela

1

मुझे क्या करना चाहिए? एक खाली वेक्टर लौटें? अगर मैं वापसी मूल्य के रिसीवर को अपवाद फेंक दिया तो क्या होगा?

फ़ंक्शन से वापस क्या किया जाता है अप्रासंगिक है, क्योंकि वापसी मूल्य किसी भी तरह से उपयोग नहीं किया जा रहा है। उस विशेष अपवाद के लिए अगले पकड़ पर निष्पादन जारी रहेगा (स्टैक को अनदेखा करने के बाद पाठ्यक्रम)।

4

जब आप throw अपवाद देते हैं, तो आप return नहीं कर सकते हैं, और इसके विपरीत। असाधारण परिस्थितियों और त्रुटियों के लिए डिज़ाइन किए गए सामान्यीकृत return के रूप में आप अपवादों के बारे में सोच सकते हैं।

int f(bool b) { 
    if (b) 
     return 42; 
    throw std::runtime_error("Runtime error!"); 
} 

जब हम इसे कहते हैं, हम अपने सामान्य वापसी मान एक अभिव्यक्ति में कैप्चर कर सकते हैं (इस मामले एक int में), या हम अपने असाधारण वापसी मान (std::runtime_error) पर कब्जा कर सकते हैं का उपयोग कर इस समारोह पर विचार करें सही प्रकार की एक catch के साथ एक try ब्लॉक:

try { 

    int normal_result = f(b); 

    // Use normal result. 
    // (Exceptional result does not exist.) 
    std::cout << normal_result << '\n'; 

} catch (const std::exception& exceptional_result) { 

    // Use exceptional result. 
    // (Normal result does not exist.) 
    std::cout << exceptional_result.what() << '\n'; 

} 

अपवाद की शक्ति, ज़ाहिर है, तथ्य यह है कि वे कॉल स्टैक अप का प्रचार जब तक वे एक चटाई तक पहुँचने से आता है चिंग catch। इस प्रकार आप अपने संसाधनों (मेमोरी, फाइलें, & सी।) को सही ढंग से प्रबंधित करते हुए सुनिश्चित करते हुए गहराई से घोंसले हुए फ़ंक्शन कॉल से बचने के लिए उनका उपयोग कर सकते हैं।

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