मुझे एक बार सलाह दी गई थी कि एक C ++ प्रोग्राम को अंततः सभी अपवादों को पकड़ना चाहिए। उस समय दिया गया तर्क अनिवार्य रूप से ऐसे कार्यक्रम थे जो अपवादों को main()
एक अजीब ज़ोंबी राज्य में प्रवेश करने से बाहर बुलबुले बनाने की अनुमति देते हैं । मुझे यह कई साल पहले बताया गया था और पूर्वव्यापीकरण में, मेरा मानना है कि मनाया घटना असाधारण रूप से बड़े कोर डंपों की लंबी पीढ़ी के कारण थी।
उस समय यह विचित्र था, लेकिन आश्वस्त था। यह पूरी तरह से निरर्थक था कि C ++ को प्रोग्रामर को सभी अपवादों को न पकड़ने के लिए "दंडित" करना चाहिए, लेकिन मेरे सामने जो सबूत थे, वे इस बात का समर्थन करते थे। प्रश्न में परियोजना के लिए, बिना किसी अपवाद के फेंकने वाले कार्यक्रमों को एक अजीब ज़ोंबी स्थिति में प्रवेश करना प्रतीत होता है - या जैसा कि मुझे संदेह है कि कारण अब था, अवांछित कोर डंप के बीच में एक प्रक्रिया को रोकना असामान्य रूप से कठिन है।
(किसी के लिए यह सोचकर कि यह उस समय अधिक स्पष्ट क्यों नहीं था: परियोजना ने कई प्रक्रियाओं से कई फाइलों में बड़ी मात्रा में आउटपुट उत्पन्न किया, जो किसी भी प्रकार के aborted (core dumped)
संदेश को प्रभावी ढंग से अस्पष्ट करता है और इस विशेष मामले में, कोर डंप की पोस्टमार्टम परीक्षा नहीं हुई थी। एक महत्वपूर्ण डिबगिंग तकनीक नहीं है, इसलिए कोर डंप को बहुत अधिक सोचा नहीं गया था। एक कार्यक्रम के मुद्दे आमतौर पर एक लंबे समय तक रहने वाले कार्यक्रम द्वारा समय पर कई घटनाओं से संचित राज्य पर निर्भर नहीं करते थे, बल्कि एक अल्पकालिक कार्यक्रम के लिए प्रारंभिक इनपुट (< 1 घंटा) इसलिए यह अधिक जानकारी प्राप्त करने के लिए डिबग बिल्ड या डीबगर से समान इनपुट के साथ एक प्रोग्राम को पुन: चलाने के लिए अधिक व्यावहारिक था।)
वर्तमान में, मैं इस बात के बारे में अनिश्चित हूं कि अपवादों को छोड़ने के लिए केवल अपवाद को पकड़ने का कोई बड़ा फायदा या नुकसान है या नहीं main()
।
छोटा सा लाभ जिसके बारे में मैं सोच सकता हूं main()
कि अतीत को बुलबुला बनाने के लिए अपवाद की अनुमति है कि यह std::exception::what()
टर्मिनल पर मुद्रित होने का कारण बनता है (कम से कम लिनक्स पर जीसीसी संकलित कार्यक्रमों के साथ)। दूसरी ओर, इसके std::exception
परिणामस्वरूप प्राप्त होने वाले सभी अपवादों को पकड़ने और परिणाम std::exception::what()
को प्रिंट करने के बजाय प्राप्त करने के लिए यह तुच्छ है और यदि किसी अपवाद से एक संदेश प्रिंट करना वांछनीय है जो std::exception
तब से नहीं निकलता है तो प्रिंट करने के लिए निकलने से पहले इसे पकड़ा जाना चाहिए main()
संदेश।
मामूली नुकसान मैं अतीत को बुलबुला करने के अपवादों की अनुमति के लिए सोच सकता हूं main()
कि अवांछित कोर डंप उत्पन्न हो सकते हैं। स्मृति की एक बड़ी मात्रा का उपयोग करने वाली प्रक्रिया के लिए यह काफी उपद्रव हो सकता है और एक कार्यक्रम से कोर डंपिंग व्यवहार को नियंत्रित करने के लिए ओएस-विशिष्ट फ़ंक्शन कॉल की आवश्यकता होती है। दूसरी ओर, यदि कोई कोर डंप और निकास वांछित है, तो इसे कॉल करके किसी भी समय प्राप्त किया जा सकता है std::abort()
और कोर डंप के बिना किसी निकास को कॉल करके किसी भी समय प्राप्त किया जा सकता है std::exit()
।
वास्तविक रूप से, मुझे नहीं लगता कि मैंने what(): ...
दुर्घटनाग्रस्त होने पर व्यापक रूप से वितरित कार्यक्रम द्वारा मुद्रित डिफ़ॉल्ट संदेश देखा है ।
क्या, यदि कोई हो, तो सी ++ अपवादों को अतीत में बुलबुले के लिए अनुमति देने के खिलाफ या मजबूत तर्क हैं main()
?
संपादित करें: इस साइट पर बहुत सारे सामान्य अपवाद हैंडलिंग प्रश्न हैं। मेरा प्रश्न विशेष रूप से C ++ अपवादों के बारे में है जिन्हें संभाला नहीं जा सकता है और इसे सभी तरह से बना दिया है main()
- शायद एक त्रुटि संदेश मुद्रित किया जा सकता है, लेकिन यह एक तुरंत रोक त्रुटि दिखा रहा है।