2013-01-01 46 views
18

मैंने एक साधारण फ़ाइल लिखा है जो डेटा फ़ाइल पढ़ता है, पाठ को पार करता है और फिर उस डेटा पर कुछ प्रोसेसिंग करता है। डेटा फ़ाइल मेरे मुख्य() फ़ंक्शन में खोला गया है। क्या यह निष्पादन() फ़ंक्शन का उपयोग करने के लिए अच्छा प्रोग्रामिंग अभ्यास है यदि यह निर्धारित किया गया है कि फ़ाइल ठीक से खोला नहीं गया था? उदाहरण:सी ++ में निकास() का सही उपयोग?

if (!file.is_open()){ 
    exit(1); 
} 

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

+0

मुझे प्रश्न समझ में नहीं आता है। क्या आपका इरादा आम तौर पर कार्यक्रम को समाप्त करना है? क्योंकि यदि हां, तो यहां कुछ भी गलत नहीं है जिसे मैं यहां देख सकता हूं। – Rapptz

उत्तर

3

exit(0) इंगित करता है सफल कार्यक्रम समाप्ति & यह पूरी तरह से पोर्टेबल है, जबकि

exit(1) (आमतौर पर) unsucessful समाप्ति इंगित करता है। हालांकि, इसका उपयोग गैर पोर्टेबल है।

+0

क्या आप एक उदाहरण प्रदान कर सकते हैं जहां इसका उपयोग गैर-पोर्टेबल है? – Rapptz

+0

@ रैपेटज़: इस पर [इस उत्तर] के अंत में चर्चा की गई है (http://stackoverflow.com/a/8696712/78845)। – Johnsyweb

+0

@ जॉन्सवेवे धन्यवाद। मैं 'वापसी 0' और 'वापसी एन' के बीच अंतर के बारे में जानता था! = 0 लेकिन यह स्पष्ट नहीं था कि यह' std :: exit' पर कैसे लागू होता है, इसलिए मुझे लगता है कि अब मुझे पता है। – Rapptz

1

main से exit(1) या return 1 में कोई अंतर नहीं है। आप सफलता के लिए 0 की वापसी/निकास मान का उपयोग करते हैं और विफलता के लिए गैर0 का उपयोग करते हैं।

यदि आपका सबराउटिन लाइब्रेरी दिनचर्या है, जिसका उपयोग कहीं और किया जाता है, तो इसे कुछ रिटर्न कोड या अपवाद के साथ मुख्य पर नियंत्रण वापस करना चाहिए। अन्यथा यह आपकी पसंद है, अगर आप exit या वापसी करते हैं।

किसी भी मामले में, यह कार्य करने के लिए अच्छा अभ्यास है कि यह कार्य क्या करता है, exit, return कोड या exception हो।

1

यह इस बात पर निर्भर करता है कि exit(1) कहां से आता है। आपको लाइब्रेरी से केवल exit(1) पर कॉल नहीं करना चाहिए, केवल आपके आवेदन से ही।

यदि आपको कोई त्रुटि कोड सेट करने की आवश्यकता है, तो आप errno (एसटीडी सी चर, हाँ) सेट कर सकते हैं।

आप एक अधिक सी ++ रास्ता की कोशिश करना चाहते हैं, तो आप एक अपवाद है, एक विस्तृत त्रुटि कोड के साथ फेंक कर सकते हैं।

14

किसी फ़ंक्शन से exit पर कॉल करना इस अर्थ में "बुरा" नहीं है कि इसमें अच्छी तरह से परिभाषित व्यवहार है - ऐसा करने में मूलभूत रूप से कुछ भी गलत नहीं है।

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

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

(और exit न केवल एक त्रुटि संदेश मुद्रित किए बिना या कुछ ऊपर लॉगिंग किए बिना लॉग इन करें, जो निराश उपयोगकर्ताओं के लिए तैयार करेगा जो कोड को सामना करने वाले किसी भी मुद्दे को ठीक करने के बारे में नहीं जानते हैं।)

+0

में 'वापसी एन'' मेरा फ़ंक्शन रिटर्न प्रकार शून्य है .. इसलिए मैं किसी भी त्रुटि को सिग्नल नहीं कर सकता । – mahela007

+2

ठीक है आपको इसे बदलने की आवश्यकता होगी, "आउट पैरामीटर" का उपयोग करें, या अपवादों का उपयोग करें। एक ऐसा फ़ंक्शन जो दोनों विफल हो सकता है और त्रुटि को सिग्नल करने का कोई तरीका नहीं है, एक डिज़ाइन त्रुटि है। – Mat

6

दो पहलू हैं। एक ऐसे स्थान पर प्रोग्राम को रोकने का निर्णय लेने का ब्याज है जिसे आप exit का उपयोग करना चाहते हैं, दूसरा बाहर निकलने का उपयोग है। Mat's answer पहले को कवर करता है।

दूसरे के लिए, exit आमतौर पर सी ++ में खराब विकल्प होता है। इसका कारण यह है कि यह कुछ सफाई (atexit के साथ पंजीकृत कार्यों और कभी-कभी स्थैतिक भंडारण अवधि की कुछ वस्तुओं के विनाशकों को शामिल करता है), लेकिन उनमें से सभी (ढेर पर वस्तुओं के विनाशक) और मेरे अनुभव में आप इसे सभी चाहते हैं या कोई नहीं।

1

बाहर निकलें स्वीकार्य है, हालांकि मुझे विश्वास है कि निकास बनाम उपयोग करने की याद में मतभेदों को ध्यान में रखना महत्वपूर्ण है। उस निकास में एक वापसी विवरण स्मृति में चर को नष्ट नहीं करेगा। अगर कुछ त्रुटि है, तो बाहर निकलें उचित है। अन्यथा, मैं वापसी बयान के साथ रहना होगा।