बनाम "का प्रयोग करें त्रुटि कोड" "अपवाद का उपयोग करें" सी ++ में रहते हुए ... उदाहरणों के सुझाव के रूप में कभी स्पष्ट नहीं है।
प्रोग्राम प्रवाह के लिए त्रुटि कोड का उपयोग करें। यदि आपके पास अपेक्षित त्रुटि है, तो अपवाद फेंक न दें। जैसेआप एक फाइल पढ़ रहे हैं, आप "फ़ाइल नहीं मिली", "फ़ाइल लॉक" के लिए अपवाद फेंक सकते हैं; लेकिन "फ़ाइल का अंत" के लिए कभी भी फेंक न दें।
यदि आप करते हैं, तो आप कभी भी सरल लूप नहीं लिख सकते हैं, आप हमेशा अपवाद हैंडलर में कोड लपेटेंगे। और मत भूलना अपवाद बहुत धीमे हैं, यह बड़े बहु थ्रेडेड सर्वरों में विशेष रूप से महत्वपूर्ण है। (आपके डेस्कटॉप एप्लिकेशन में बिल्कुल इतना महत्वपूर्ण नहीं है)।
दूसरा, अपवाद पदानुक्रमों के साथ बहुत सावधान रहें। आपको लगता है कि Exception
कक्षा होना ठीक है, उसके बाद NetException
प्राप्त करें, फिर अपने SMTP वर्ग के लिए SMTPException
प्राप्त करें। लेकिन जब तक आप बेस क्लास में सामान्य डेटा नहीं रखते हैं, तब तक आपको हमेशा उस पदानुक्रम में हर प्रकार के अपवाद को पकड़ना होगा। जैसे यदि आप अपने SMTPException
कक्षा में SMTP त्रुटि का कारण डालते हैं, तो आपको इसे पकड़ना होगा - यदि आप केवल Exception
प्रकारों को पकड़ते हैं, तो आपके पास SMTPException
सदस्यों तक पहुंच नहीं होगी। इस समस्या के लिए एक अच्छा कामकाज आधार अपवाद वर्ग में एक स्ट्रिंग और एक int सदस्य होना है और व्युत्पन्न प्रकारों के लिए भी उनका उपयोग करें। दुर्भाग्य से std::exception
केवल एक स्ट्रिंग :(
कुछ लोगों का कहना यह कर मतलब है कि आप के रूप में अच्छी केवल एक ही अपवाद प्रकार हो सकता है, तो आप हमेशा आधार वर्ग फिर भी लिखते पकड़ेगा विशेष रूप से के रूप में प्रदान करता है।
आप उपयोग करते हैं अपवादों को आपको एक त्रुटि कोड के साथ अधिक डेटा के साथ पॉप्युलेट करने के लिए परेशानी लेनी होगी। त्रुटियों के साथ, आपको उन्हें तुरंत संभालना होगा या वे कोड में खो जाएंगे। अपवाद के साथ, यह कई स्तरों से दूर हो सकता है जहां से यह रॉडडी के उदाहरण में फेंक दिया गया था। DoC
कहा जाता है, और DoA
से अपवाद 2 स्तर प्राप्त करता है। जब तक आप DoA
में कोड के लिए विशिष्ट होने के लिए त्रुटि निर्दिष्ट नहीं करते हैं, तो आपको लगता है कि इसे 0 से फेंक दिया गया थासमारोह। (सरल उदाहरण है, लेकिन मैं कोड जहां एक अपवाद कॉल स्टैक नीचे कई स्तरों संचालित किया गया देखा है। यह डिबग करने के लिए अब सेंट वां था। यह विशेष रूप से OO कार्यक्रमों के लिए लागू होता है)
तो उम्मीद है, मैं दे दिया है आप के बारे में सोचने के लिए पर्याप्त है। इस मामले की सरल सत्य यह है कि शैली का अर्थ है त्रुटि प्रबंधन में कुछ भी नहीं, व्यावहारिकता सबकुछ है। यदि आपको हर जगह लॉग स्टेटमेंट रखना है तो एक त्रुटि हो सकती है, फिर ऐसा करें। यह बहुत अधिक मायने रखता है कि आप देख सकते हैं कि आपके पास एक असाधारण अपवाद पदानुक्रम है या आपने अपवाद हैंडलर के साथ अपना कोड खराब कर दिया है, जहां कोड गलत हो गया था (और किस डेटा के साथ काम किया जा रहा था)। यदि आप आसानी से त्रुटि का पता नहीं लगा सकते हैं, तो आपका त्रुटि प्रबंधन कोड बेकार है।
अपवाद अच्छे हैं, उनका उपयोग करें। लेकिन आप जो कर रहे हैं उसके बारे में सोचें, उनका दुरुपयोग न करें या उनका दुरुपयोग न करें। एक दुरुपयोग अपवाद किसी भी त्रुटि को संभालने से भी बदतर है (क्योंकि आप क्रैश डंप को पकड़ सकते हैं और सेकंड में त्रुटि खोजने के लिए अनचाहे अपवाद को देख सकते हैं। अपवाद और अनदेखा अपवाद के साथ, आप भरे हुए हैं)।
मुझे पिछले कुछ वर्षों में पता चला है कि डिबगिंग का सबसे बड़ा सहायक लॉगिंग कर रहा है। लॉग लिखें, बहुत सारे लॉग लिखें।
अच्छा। मैंने अपनी खरीद-सूची में जोड़ा है। (और मैं इस जवाब को भी वोट दूंगा, जैसे ही मैं फिर से मतदान कर सकता हूं। :-)) –
+1, स्रोत नामकरण के कारण, और बुलेट सारांश। – paercebal