मैं इसे सरल रखता हूं।
लाइब्रेरी में आधार अपवाद प्रकार होता है, जिसे std ::: runtime_error से बढ़ाया जाता है (जो कि C ++ से अन्य भाषाओं के लिए उपयुक्त है)। यह अपवाद एक संदेश स्ट्रिंग लेता है ताकि हम लॉग कर सकें; हर थ्रो पॉइंट में एक अनूठा संदेश होता है (आमतौर पर एक यूनिक आईडी के साथ)।
यह इसके बारे में।
नोट 1 : उन स्थितियों में जहां अपवाद को पकड़ने वाला व्यक्ति अपवादों को ठीक कर सकता है और कार्रवाई फिर से शुरू कर सकता है। मैं उन चीजों के लिए व्युत्पन्न अपवाद जोड़ूंगा जो संभावित रूप से एक दूरस्थ स्थान पर विशिष्ट रूप से तय किए जा सकते हैं। लेकिन यह बहुत दुर्लभ है (याद रखें कि कैचर थ्रो पॉइंट के करीब होने की संभावना नहीं है, इस प्रकार समस्या को ठीक करना कठिन होने वाला है (लेकिन सब कुछ स्थिति पर निर्भर है)।
नोट 2 : कभी-कभी पुस्तकालय इतना सरल होता है कि वह अपना अपवाद देने लायक नहीं होता है और std :: runtime_error करेगा। केवल एक अपवाद होना महत्वपूर्ण है यदि इसे std से अलग करने की क्षमता :: runtime_error उपयोगकर्ता को इसके साथ कुछ करने के लिए पर्याप्त जानकारी दे सकता है।
नोट 3 : एक वर्ग के भीतर मैं आमतौर पर त्रुटि कोड पसंद करता हूं (लेकिन ये मेरी कक्षा के सार्वजनिक एपीआई में नहीं बचेंगे)।
अपने ट्रेड ऑफ को देखते हुए:
मेरे द्वारा देखे जाने वाले व्यापार में शामिल हैं:
अधिक अपवाद कक्षाएं एपीआई उपयोगकर्ताओं के लिए त्रुटि से निपटने के लिए बहुत महीन अनाज स्तर की अनुमति दे सकती हैं (उपयोगकर्ता कॉन्फ़िगरेशन या डेटा त्रुटियों, या फ़ाइलें नहीं मिल रही हैं)
क्या अधिक अपवाद वास्तव में आपको बारीक अनाज नियंत्रण देते हैं? यह प्रश्न बनता है कि कैचिंग कोड वास्तव में अपवाद के आधार पर त्रुटि को ठीक कर सकता है। मुझे यकीन है कि इस तरह की परिस्थितियां हैं और इन मामलों में आपके पास एक और अपवाद होना चाहिए। लेकिन एकमात्र उपयोगी सुधार के ऊपर आपके द्वारा सूचीबद्ध सभी अपवाद एक बड़ी चेतावनी उत्पन्न करते हैं और एप्लिकेशन को रोकते हैं।
अधिक अपवाद कक्षाएं त्रुटि सूचना को केवल एक स्ट्रिंग संदेश या त्रुटि कोड के बजाय अपवाद में एम्बेड करने की अनुमति देती हैं
अपवादों का उपयोग करने का यह बहुत बड़ा कारण है। लेकिन जानकारी उस व्यक्ति के लिए उपयोगी होनी चाहिए जो इसे कैशिंग कर रहा है। क्या वे कुछ सुधारात्मक कार्रवाई करने के लिए सूचना का उपयोग कर सकते हैं? यदि ऑब्जेक्ट आपके लाइब्रेरी में आंतरिक है और इसका उपयोग किसी भी एपीआई को प्रभावित करने के लिए नहीं किया जा सकता है, तो जानकारी बेकार है। आपको बहुत विशिष्ट होना चाहिए कि फेंक दी गई जानकारी का उस व्यक्ति के लिए उपयोगी मूल्य है जो उसे पकड़ सकता है। इसे पकड़ने वाला व्यक्ति आमतौर पर आपकी सार्वजनिक एपीआई के बाहर होता है इसलिए आपकी जानकारी को दर्ज़ करें ताकि इसे आपके सार्वजनिक एपीआई की चीजों के साथ इस्तेमाल किया जा सके।
यदि वे सभी कर सकते हैं तो अपवाद लॉग इन करें तो बहुत सारे डेटा के बजाय केवल एक त्रुटि संदेश फेंकना सबसे अच्छा है। जैसा कि पकड़ने वाला आमतौर पर डेटा के साथ एक त्रुटि संदेश का निर्माण करेगा। यदि आप त्रुटि संदेश का निर्माण करते हैं तो यह सभी कैचर्स के अनुरूप होगा, यदि आप कैचर को त्रुटि संदेश का निर्माण करने की अनुमति देते हैं तो आपको उसी त्रुटि की सूचना मिल सकती है जो कॉल करने और पकड़ने के आधार पर अलग-अलग रिपोर्ट की जाती है।
कम अपवाद, लेकिन एक त्रुटि कोड को एम्बेड करना जिसका उपयोग लुकअप के रूप में किया जा सकता है
आपको यह निर्धारित करना होगा कि त्रुटि कोड का सार्थक उपयोग किया जा सकता है। अगर यह हो सकता है तो आपके पास इसका खुद का अपवाद होना चाहिए। अन्यथा आपके उपयोगकर्ताओं को अब कैच के अंदर स्विच स्टेटमेंट लागू करने की आवश्यकता है (जो कि कैच के पूरे बिंदु को स्वचालित रूप से सामान को संभालने के लिए हरा देता है)।
यदि यह तब नहीं हो सकता है तो अपवाद में त्रुटि संदेश का उपयोग क्यों न करें (कोड को विभाजित करने की आवश्यकता नहीं है और संदेश इसे देखने के लिए एक दर्द बनाता है)।
फ़ंक्शंस से सीधे त्रुटि कोड और झंडे लौटना (कभी-कभी थ्रेड्स से संभव नहीं)
आंतरिक रूप से रिटर्निंग त्रुटि कोड बहुत अच्छा है। यह आपको वहां और उसके बाद कीड़े को ठीक करने की अनुमति देता है और आपको यह सुनिश्चित करना होगा कि आप सभी त्रुटि कोड को ठीक कर लें और उनके लिए खाता बना लें। लेकिन उन्हें अपने सार्वजनिक एपीआई पर लीक करना एक बुरा विचार है। समस्या यह है कि प्रोग्रामर अक्सर त्रुटि राज्यों की जांच करना भूल जाते हैं (कम से कम एक अपवाद के साथ एक अनियंत्रित त्रुटि एप्लिकेशन को अन-हैंडल की गई त्रुटि को छोड़ने के लिए मजबूर कर देगी जो आमतौर पर आपके सभी डेटा को भ्रष्ट कर देगा)।
किसी ईवेंट या कॉलबैक सिस्टम को त्रुटि पर लागू किया गया (स्टैक अनइंडिंग से बचा जाता है)
इस पद्धति का उपयोग अक्सर अन्य त्रुटि हैंडलिंग तंत्र (विकल्प के रूप में नहीं) के साथ किया जाता है। अपने विंडोज़ प्रोग्राम के बारे में सोचें। एक उपयोगकर्ता एक मेनू आइटम का चयन करके एक कार्रवाई शुरू करता है। यह ईवेंट कतार पर एक कार्रवाई उत्पन्न करता है। घटना कतार अंततः कार्रवाई को संभालने के लिए एक धागा प्रदान करती है। थ्रेड कार्रवाई को संभालने के लिए माना जाता है और अंततः थ्रेड पूल में वापस आ जाता है और दूसरे कार्य की प्रतीक्षा करता है। यहां एक अपवाद को काम के साथ थ्रेड द्वारा आधार पर पकड़ा जाना चाहिए। अपवाद को पकड़ने का नतीजा आम तौर पर मुख्य लूप के लिए उत्पन्न होने वाली घटना के परिणामस्वरूप होगा जो अंततः उपयोगकर्ता को प्रदर्शित होने वाले त्रुटि संदेश में परिणाम देगा।
लेकिन जब तक आप अपवाद को जारी नहीं रख सकते हैं तब तक स्टैक कम से कम (थ्रेड के लिए) कम होने वाला है।