2017-12-23 134 views
6

में कुछ कोड लिखा गया है, यदि मैंने दिया गया उपयोगकर्ता इनपुट अमान्य है तो मैंने अपवाद का सामना किया है, इसलिए मैंने इसे एक कोशिश/पकड़ ब्लॉक में रखा है, फिर भी यह एक अपवाद फेंक दिया है । कोड स्वयं काफी लंबा है इसलिए यहां कोड का सरलीकृत संस्करण है जो अपवाद का भी सामना करता है। अपवाद स्वयं स्पष्ट है, स्थिति "3" मौजूद नहीं है इसलिए स्वाभाविक रूप से यह एक अपवाद फेंक देगा, लेकिन यह एक कोशिश/पकड़ ब्लॉक के अंदर है इसलिए इसे पकड़ा जाना चाहिए, लेकिन ऐसा नहीं है।मुझे एक अपवाद मिल रहा है भले ही कोड एक कोशिश/पकड़ ब्लॉक

int main() { 
    try 
    { 
     vector<string> test = vector<string>{ "a","b","c" }; 
     string value = test[3]; 
    } 
    catch (...) 
    { 

    } 
} 

इस कोड को चलाने से केवल निम्नलिखित अपवाद में परिणाम होता है चाहे वह कोशिश/पकड़ ब्लॉक में हो या नहीं।

Exception

मैं भी अपवाद (const out_of_range&e) को निर्दिष्ट करने की कोशिश की लेकिन है कि या तो मदद नहीं की। यह सिर्फ सटीक एक ही अपवाद का कारण बन गया।

int main() { 
    try 
    { 
     vector<string> test = vector<string>{ "a","b","c" }; 
     string value = test[3]; 
    } 
    catch (const out_of_range&e) 
    { 

    } 
} 

मैं दृश्य स्टूडियो का उपयोग कर रहा है, इस आईडीई या संकलक इसे इस्तेमाल करता है के साथ एक समस्या हो सकता है?

+0

एलिमेंट 3 आपके वेक्टर का सदस्य नहीं है। इसके बजाय 2 का प्रयोग करें। – Raindrop7

+2

* अपवाद * ओम कंप्यूटर सिस्टम के विभिन्न प्रकार हैं। आप केवल उन लोगों को पकड़ सकते हैं जिन्हें सी ++ से फेंक दिया जाता है, न कि सॉफ़्टवेयर, ऑपरेटिंग सिस्टम या हार्डवेयर त्रुटियों के कारण होते हैं। एक क्रैश जिसकी आपको आवश्यकता है [अपने कार्यक्रमों को डीबग करना सीखें] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)। –

+1

आपके * क्रैश * के पीछे कारण के कारण आपको अपनी [शुरुआती किताबें] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) पर वापस जाना चाहिए और उनकी समीक्षा करें । –

उत्तर

11

यदि आप std::vectorstd::out_of_range अपवाद फेंकने के लिए चाहते हैं, तो आपको .at() विधि का उपयोग करने की आवश्यकता है। operator[] अपवाद नहीं फेंकता है।

उदाहरण के लिए, आप कुछ इस तरह कर सकते हैं:

std::vector<int> myvector(10); 
try { 
    myvector.at(20)=100;  // vector::at throws an out-of-range 
} 
catch (const std::out_of_range& e) { 
    std::cerr << "Out of Range error: " << e.what() << '\n'; 
} 
8

यह एक अपवाद नहीं है। यह एक डीबग जोरदार विफलता है।

यदि आप एक अपवाद चाहते हैं तो आपको वेक्टर के (इंडेक्स) फ़ंक्शन का उपयोग करने की आवश्यकता है, न कि सरणी सबस्क्रिप्ट ऑपरेटर।

1

ऑपरेटर [] वेक्टर कंटेनर में अतिभारित लेकिन अपवाद सुरक्षित (व्यवहार इस तरह के ऊपर अपनी पोस्ट में के रूप में, विफलता के मामले में अपरिभाषित है नहीं है)

आपको इसके बजाय .at() फ़ंक्शन का उपयोग करना चाहिए। यह अपवाद सुरक्षित है। cplusplus.com संदर्भ का कहना है:

Strong guarantee: if an exception is thrown, there are no changes in the container. 
It throws out_of_range if n is out of bounds. 

पढ़ें: अपवाद सुरक्षा के लिए तल पर http://www.cplusplus.com/reference/vector/vector/operator[]/ http://www.cplusplus.com/reference/vector/vector/at/

देखो।

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

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