2011-10-30 5 views
5

मैं एक ऐसा फ़ंक्शन लिखने की कोशिश कर रहा हूं जो उपयोगकर्ता को पांच अंक संख्या के लिए संकेत देता है, और मैं खराब इनपुट को संभालने के लिए अपवाद ब्लॉक लिखना चाहता हूं, जिससे उपयोगकर्ता स्ट्रिंग या कुछ गैर-पूर्णांक इनपुट दर्ज करने का प्रयास करता है।खराब इनपुट के लिए अपवाद हैंडलिंग कैसे लिखूं?

मुझे पता है कि एक डिवीजन फ़ंक्शन जैसे किसी अपवाद के लिए अपवाद हैंडलिंग ब्लॉक कैसे लिखना है, जहां आपने 0 के लिए अपवाद फेंक दिया है, लेकिन मुझे कोई संकेत नहीं है कि इनपुट के लिए यह कैसे करें, जिसका मेरा कोई नियंत्रण नहीं है।

उत्तर

7

सबसे पहले, मैं आम तौर पर इसके खिलाफ सलाह देता हूं - उपयोगकर्ता से खराब इनपुट अपवाद के बजाए लगभग नियम है।

तुम वैसे भी यह कर पर जोर देते हैं, तो आप शायद यह कुछ भी इनपुट के रूप में स्वीकार करने, और उसके बाद एक अपवाद फेंक कर करना चाहते हैं जब/अगर यह नहीं है कि आप क्या चाहते:

// Warning: untested code.  
// Accepting negative numbers left as an exercise for the reader. 
int get_int(std::istream &is) { 
    std::string temp; 

    std::getline(temp, is); 

    for (int i=0; i<temp.size(); i++) 
     if (!isdigit(temp[i])) 
      throw std::domain_error("Bad input"); 
    return atoi(temp); 
} 

मैं फिर कहता हूँ, हालांकि, मुझे नहीं लगता कि यह आम तौर पर एक अच्छा विचार है। मैं ध्यान दूंगा (एक उदाहरण के लिए) कि iostreams पहले से ही इस तरह की स्थितियों के लिए fail बिट को परिभाषित करता है (और सामान्य operator>> तंत्र के उपयोग को पढ़ने के लिए)।

+0

आप 'atoi()' का उपयोग करते हैं लेकिन फिर भी गैर-अंकों के लिए अपनी स्ट्रिंग के प्रत्येक चरित्र की जांच करें। क्यूं कर?? – vsz

+0

धन्यवाद। किसी कारण से मैं मानसिकता में फंस गया था कि मेरा इनपुट एक पूर्णांक चर में संग्रहीत किया जाना था। एक स्ट्रिंग के रूप में इनपुट को स्वीकार करना और फिर इसे परिवर्तित करना मेरी समस्या हल करता है। – JeramyRR

+0

@vsz: उनका प्रश्न विशेष रूप से खराब इनपुट की जांच करने और सामने आने पर अपवाद फेंकने के बारे में था। ऐसा करने के बाद, 'atoi' एक int वापस करने का सबसे तेज़ और आसान तरीका था। –

0

सबसे सरल समाधान एक स्ट्रिंग को पढ़ने और इसे पूर्णांक में परिवर्तित करना है, उदाहरण के लिए atoi के साथ। यदि आपको परिणाम के रूप में शून्य मिलता है, और आपकी स्ट्रिंग "0" नहीं थी, तो आप जानते हैं कि इनपुट स्ट्रिंग के माध्यम से लूप की आवश्यकता के बिना संख्यात्मक नहीं था।

+0

दुर्भाग्यवश मुझे प्रोग्राम के इनपुट हिस्से को समाप्त करने के लिए 0 का उपयोग करने की आवश्यकता है, इसलिए मुझे पता होना चाहिए कि इनपुट वास्तव में कब होता है 0. – JeramyRR

+0

यदि इनपुट वास्तव में 0 है या नहीं तो आप अलग से जांच सकते हैं। Http://stackoverflow.com/questions/1640720/how-do-i-tell-if-the-c-function-atoi-failed-or-if-it-was-a- पर एक और विस्तृत चर्चा मिल सकती है। स्ट्रिंग के- शून्य – vsz

0

किसी अन्य मशीन या प्रक्रिया से डेटा स्वीकार करते समय अपवाद अक्सर उपयुक्त होते हैं, जहां अन्यथा वैध डेटा स्ट्रीम के भीतर अमान्य डेटा होने की अपेक्षा करने का कोई कारण नहीं है। उपयोगकर्ता इनपुट के संबंध में, अपवादों का केवल उन मामलों में उपयोग किया जाना चाहिए जो सामान्य कार्यक्रम प्रवाह से स्पष्ट प्रस्थान का प्रतिनिधित्व करना चाहिए। उदाहरण के लिए, यदि किसी प्रोग्राम में टीटी-स्टाइल इंटरफ़ेस होता है, और इनपुट की एक पंक्ति को पढ़ने वाला एक दिनचर्या नियंत्रण-सी प्राप्त करता है, तो यह अपवाद फेंकने के लिए इस तरह के दिनचर्या के लिए उपयोगी हो सकता है। नियंत्रण-सी को प्रोग्राम को अनिवार्य रूप से समाप्त नहीं करना चाहिए, लेकिन यदि प्रोग्राम उपयोगकर्ता से इनपुट की कई पंक्तियों को पढ़ने की उम्मीद कर रहा है, तो एक को नियंत्रण-सी टाइप करना अक्सर शेष को छोड़ा जाना चाहिए।