2012-05-21 8 views
7

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

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

तो मैं इससे कैसे निपट सकता हूं? एक बात मुझे यकीन नहीं है कि मैं चाहता हूं कि हर वर्ग विधि में एक निकास बिंदु है जो असफल हो सकता है। यह असंभव लगता है। क्या मै गलत हु? क्या इस तरह के कोडों में विफलता बिंदु पर exit() या abort() पर कॉल करने के लिए स्वीकार्य अभ्यास है? या क्या मुझे मुख्य रूप से कुछ सामान्य पकड़ विवरण में अपवाद फेंकना चाहिए? क्या फायदा है?

+0

क्या कोई अपवाद से पुनर्प्राप्त करने से कोई अच्छा है या जब भी कोई त्रुटि होती है तो आप बाहर निकलना चाहते हैं? जब कोई त्रुटि हर बार दुर्घटनाग्रस्त हो जाती है तो यह थोड़ा अधिक नहीं होता है? – DumbCoder

+0

मैं अपवादों का उपयोग कर रहा हूं और गैर-घातक समस्याओं की तरह हूं। मैं वास्तव में यहां घातक त्रुटि की स्थिति को हल करने की कोशिश कर रहा हूं। – Fadecomic

उत्तर

4

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

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

तो बाहर निकलने का उचित तरीका एप्लिकेशन पर निर्भर करता है। यदि कोई एप्लिकेशन जानता है कि यह सुरक्षित है तो _Exit(), abort(), exit(), या quickexit() को कॉल करना पूरी तरह से उचित हो सकता है। (लाइब्रेरी कोड को इन्हें कॉल नहीं करना चाहिए, क्योंकि स्पष्ट रूप से लाइब्रेरी को यह नहीं पता है कि यह हर एप्लिकेशन के लिए सुरक्षित है या नहीं, जो लाइब्रेरी का उपयोग करेगा।) यदि कुछ महत्वपूर्ण साफ है जो किसी एप्लिकेशन से बाहर निकलने से पहले किया जाना चाहिए लेकिन आपको पता है कि यह सीमित है , तो अनुप्रयोग atexit() या at_quick_exit() के माध्यम से उस साफ़ कोड को पंजीकृत कर सकता है।

तो मूल रूप से यह तय करें कि आपको क्या साफ करने की आवश्यकता है, इसे दस्तावेज करें, इसे कार्यान्वित करें, और यह सुनिश्चित करने का प्रयास करें कि इसका परीक्षण किया गया है।

2

मैं वैश्विक समारोह

void stopProgram() { 
    exit(1); 
} 

बाद में आप यह व्यवहार है बदल सकते हैं कॉल करने के लिए सुझाव देंगे, तो यह पोषणीय है।

+0

यह 'शून्य निकास (int स्थिति)' है, 'शून्य निकास नहीं है)। – Griwes

+0

@Griwes: धन्यवाद, अपडेट किया गया –

1

जैसा कि आपने बताया है, exit या abort आपके पूरे कोड के चारों ओर फेंकने योग्य नहीं है ... इसके अतिरिक्त, भविष्य में एक तंत्र हो सकता है जो आपको किसी त्रुटि से पुनर्प्राप्त करने की अनुमति दे सकता है, या किसी त्रुटि को संभाल सकता है बस बाहर निकलने की तुलना में एक अधिक सुंदर तरीके से, और यदि आप पहले से ही इस कार्यक्षमता को कड़ी-कोडित कर चुके हैं, तो इसे पूर्ववत करना बहुत कठिन होगा।

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

4

प्रोग्राम को समाप्त करने के लिए स्वीकार्य है अगर यह गलती से त्रुटि को संभाल नहीं सकता है।

  • कॉल abort() यदि आप एक कोर डंप की जरूरत है: वहाँ कुछ चीजें आप कर सकते हैं।
  • exit() पर कॉल करें यदि आप atexit() (जो वैश्विक सी ++ ऑब्जेक्ट्स के लिए विनाशकों को कॉल करने की संभावना है) पर चलाने का मौका देना चाहते हैं।
  • तुरंत प्रक्रिया को समाप्त करने के लिए _exit() पर कॉल करें।

जब तक आप समझते हैं कि आप क्या कर रहे हैं, अपने अन्य विकल्पों को जानें, और स्वेच्छा से उस पथ का चयन करें, तब तक उन कार्यों का उपयोग करने में कुछ भी गलत नहीं है। आखिरकार, यही कारण है कि वे कार्य मौजूद हैं। इसलिए यदि आपको नहीं लगता कि यह त्रुटि को संभालने का प्रयास करने के लिए कोई समझ नहीं आता है या ऐसा होता है तो कुछ और करता है - आगे बढ़ें। मैं शायद कुछ जानकारीपूर्ण संदेश लॉग इन करने का प्रयास करता हूं (कहें, syslog पर), और _exit पर कॉल करें। अगर लॉगिंग विफल हो जाती है - समाप्ति के साथ कोर प्राप्त करने के लिए abort पर कॉल करें।

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