जब आप कोई अपवाद फेंकते हैं, तो फ़ंक्शन वहां रुक जाता है और जहां भी अपवाद पकड़ा जाता है वहां निष्पादन कूदता है। आपका फ़ंक्शन कुछ भी वापस नहीं करता है क्योंकि फ़ंक्शन बिल्कुल वापस नहीं आता है।
तुम बस
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
ब्लॉक में उन दो चीजों के होने से पहले कूद गया।
स्रोत
2012-03-03 20:18:11
यदि आप कोई अपवाद फेंकते हैं, तो आपका फ़ंक्शन वापस नहीं आता है। यह पूरी बात है। –
तो शायद मेरे कार्य को रद्द कर दें और मेरे वेक्टर के संदर्भ में एक और पैरामीटर जोड़ें? – Mihaela
संभावित डुप्लिकेट [अपवाद फेंकने के बाद लौटने] [http://stackoverflow.com/questions/3109943/returning-after-throwing-exceptions) –