त्रुटि हैंडलिंग को कैसे लागू करें [बंद]


13

भले ही मैंने कुछ वर्षों के लिए पेशेवर स्तर पर प्रोग्राम किया हो लेकिन मैं अभी भी एरर हैंडलिंग को पूरी तरह से नहीं समझ पा रहा हूं। यद्यपि मेरे अनुप्रयोग ठीक काम करते हैं, त्रुटि से निपटने को पेशेवर स्तर पर लागू नहीं किया जाता है और यह कई तकनीकों का मिश्रण और मेल है।

मेरी त्रुटि से निपटने के पीछे कोई संरचना नहीं है। मैं सीखना चाहता हूं और समझना चाहता हूं कि यह पेशेवर स्तर पर कैसे लागू होता है। यह एक ऐसा क्षेत्र है जहां मुझे ज्ञान की कमी है।

मुझे एक अपवाद का उपयोग कब करना चाहिए और मुझे तर्क प्रवाह में जाँच की जाने वाली सफलता की स्थिति कब लौटानी चाहिए? क्या अपवाद और स्थिति वापस करना ठीक है?

मैं मुख्य रूप से C # में कोड करता हूं।


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

6
आपका प्रश्न बहुत व्यापक है। शायद आप अपने कोडिंग लक्ष्यों को प्राप्त करने में विफल रहने के विशिष्ट उदाहरणों के संबंध में गुंजाइश को कम कर सकते हैं।
एंडिज स्मिथ

त्रुटि से निपटने के बारे में वेब पर कई लेख हैं: इसे आज़माएँ: msdn.microsoft.com/en-us/library/seyhszts.aspx
Nir Kornfeld

जवाबों:


25
  1. असाधारण चीजों के लिए अपवादों का उपयोग करें, जिन चीजों से आप बहुत अधिक बार मुठभेड़ की उम्मीद नहीं कर सकते हैं, वे चीजें जो इंगित करती हैं कि कुछ गलत है। उदाहरण के लिए, यदि नेटवर्क डाउन है, तो यह वेब सर्वर के लिए एक असाधारण बात है। यदि डेटाबेस अनुपलब्ध है, तो इसका मतलब है कि कुछ गलत है। यदि कॉन्फ़िगरेशन फ़ाइल अनुपलब्ध है, तो संभवतः इसका अर्थ है कि उपयोगकर्ता ने इसके साथ गड़बड़ की है।

  2. गलत कोड को संभालने के लिए अपवादों का उपयोग न करें। कोड की शुद्धता की जांच करने के लिए, आपको .NET फ्रेमवर्क 4 और बाद में, या तो कोड कॉन्ट्रैक्ट्स (जो अभिकथनों की जगह लेते हैं और अतिरिक्त, विशेष रूप से मूल्यवान विशेषताएं हैं) का उपयोग करना चाहिए।

  3. गैर-असाधारण मामलों में अपवादों का उपयोग न करें। तथ्य यह है कि उपयोगकर्ता, जब एक संख्या दर्ज करने के लिए कहा जाता है, तो "कुत्ते" में प्रवेश करना अपवाद के लायक इतना असाधारण नहीं है।

  4. अपवादों के प्रकारों का चयन करते समय सावधान रहें। जरूरत पड़ने पर अपने खुद के प्रकार बनाएं। ध्यान से विरासत को चुना, यह ध्यान में रखते हुए कि माता-पिता को पकड़ने से बच्चों को भी पकड़ा जाएगा। कभी नहीं throw Exception

  5. त्रुटियों के लिए रिटर्न कोड का उपयोग न करें। त्रुटि कोड आसानी से नकाबपोश, अनदेखा, भुला दिए जाते हैं। यदि कोई त्रुटि है, या तो इसे संभाल लें, या इसे ऊपरी स्टैक पर प्रचारित करें।

  6. ऐसे मामलों में जहां किसी विधि से त्रुटि की वापसी की उम्मीद की जाती है और त्रुटि असाधारण नहीं है, एनम का उपयोग करें, कभी भी त्रुटि संख्या नहीं। उदाहरण:

    // Note that the operation fails pretty often, since it deals with the servers which are
    // frequently unavailable, and the ones which send garbage instead of the actual data.
    private LoadOperationResult LoadProductsFromWeb()
    {
        ...
    }

    का अर्थ LoadOperationResult.ServerUnavailable, LoadOperationResult.ParsingErrorआदि और अधिक स्पष्ट है, की तुलना में कहना है कि कोड को याद 12 का मतलब है कि सर्वर डाउन है, और कोड 13 - कि डेटा पार्स नहीं किया जा सकता।

  7. जब वे विशिष्ट डोमेन में काम करने वाले प्रत्येक डेवलपर द्वारा ज्ञात सामान्य लोगों को संदर्भित करते हैं, तो त्रुटि कोड का उपयोग करें। उदाहरण के लिए, HTTP 404 Not Found या HTTP 500 इंटरनल सर्वर एरर के लिए एनम वैल्यू को रिइंस्टॉल न करें।

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

  9. हर अपवाद को न पकड़ें (जब तक कि आप ढेर के शीर्ष पर न हों)। यदि आप एक अपवाद को पकड़ते हैं, तो आपको इसे संभालने के लिए तैयार होना चाहिए। सब कुछ पकड़ने से पता चलता है कि अगर आपका कोड सही तरीके से चलता है तो आपको कोई परवाह नहीं है। यह "मैं अभी इसे कैसे ठीक करना चाहता हूं, खोज नहीं करना चाहता" हल कर सकता है, लेकिन जल्द या बाद में आपको चोट पहुंचाएगा।

  10. C # में, इस तरह के अपवादों को कभी भी खारिज न करें:

    catch (SomeException ex)
    {
        ...
        throw ex;
    }

    क्योंकि आप स्टैक तोड़ रहे हैं। इसके बजाय यह करें:

    catch (SomeException)
    {
        ...
        throw;
    }
  11. अपवाद संदेश लिखते समय प्रयास करें। कितनी बार मैंने कुछ ऐसा देखा है throw Exception("wrong data")या throw Exception("shouldn't call this method in this context")। छह महीने बाद खुद सहित अन्य डेवलपर्स को पता नहीं होगा कि डेटा क्या गलत है और हमें किसी संदर्भ में कुछ विधि क्यों और क्यों नहीं कहनी चाहिए, न ही कौन सा संदर्भ ठीक है।

  12. उपयोगकर्ता को अपवाद संदेश न दिखाएं। वे आम लोगों के लिए अपेक्षित नहीं हैं, और अक्सर स्वयं डेवलपर्स के लिए भी अपठनीय हैं।

  13. अपवाद संदेशों को स्थानीय न करें। स्थानीयकृत संदेश के लिए दस्तावेज़ खोजना थकाऊ और व्यर्थ है: प्रत्येक संदेश केवल अंग्रेजी और अंग्रेजी में होना चाहिए।

  14. अपवादों और त्रुटियों पर विशेष रूप से ध्यान केंद्रित न करें: लॉग भी अत्यंत महत्वपूर्ण हैं।

  15. .NET में, विधि के XML प्रलेखन में अपवादों को शामिल करना न भूलें:

    /// <exception cref="MyException">Description of the exception</exception>

    XML दस्तावेज़ीकरण में अपवादों को शामिल करना लाइब्रेरी का उपयोग करने वाले व्यक्ति के लिए चीजों को बहुत आसान बनाता है। यह अनुमान लगाने की कोशिश करने से अधिक कष्टप्रद कुछ भी नहीं है कि कौन सा अपवाद संभवतः एक विधि द्वारा फेंका जा सकता है और क्यों।

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


Except यह कहा जा रहा है, मैं अपवादों और त्रुटियों के बीच जावा अंतर को बहुत बेकार और भ्रामक पाता हूं, यह देखते हुए कि भाषा ने अपवादों की जाँच और अनियंत्रित किया है। सौभाग्य से, .NET फ्रेमवर्क में केवल अपवाद हैं, और कोई त्रुटि नहीं है।


मैंने इस से थोड़ा सीख लिया, क्या मैं पूछ सकता हूं कि सूची कहां से आई है? साइट या व्यक्तिगत अनुभव? किसी भी तरह से असाधारण नौकरी (वह प्राप्त करें?)।
शेल्बी ११५

@ Shelby115: सूची क्रम से आती है: स्टैक एक्सचेंज, व्यक्तिगत अनुभव और स्टीव मैकोनेल द्वारा पूरा कोड।
आर्सेनी मौरज़ेंको

धन्यवाद @MainMa कि एक उत्कृष्ट प्रतिक्रिया है! जब मैं यूनिवर्सिटी में था तब मैंने कोड कम्प्लीट किया था लेकिन किसी ने उसे चुरा लिया था। मुझे यह पढ़ने को नहीं मिला।
जेम्स जेफरी

@JamesJeffery: फिर एक पुस्तकालय में दूसरा संस्करण उधार लें, या एक खरीदें: यह विकास की दुर्लभ पुस्तकों में से एक है जो पूरी तरह से पैसे के लायक है।
आर्सेनी मूरज़ेंको

@ मेनमा सिर्फ अमेज़ॅन से ऑर्डर किया गया, धन्यवाद: DI का अपना क्लीन कोड भी है, और पूरी तरह से अध्याय 7 के बारे में भूल गया।
जेम्स जेफरी

1

मुझे लगता है कि मेनमा की सूची बहुत पूरी है। मैं बस अपना खुद का कुछ जोड़ूंगा:

  1. एरिक लिपर्ट का लेख पढ़ें कि वह अपवादों को कैसे वर्गीकृत करते हैं। विशेष रूप से महत्वपूर्ण उनके अपवाद को नहीं पकड़ने पर है जो आपके कोड में वास्तविकता की बग में हैं। इसके बजाय कोड को ठीक करें!
  2. यदि आप जानते हैं कि एक अपवाद हो सकता है और आप इसके बारे में कुछ कर सकते हैं, तो इसे संभालें, लेकिन आप जिस दायरे को आज़मा रहे हैं, उस विशिष्ट सीमा को सीमित करें और उस विशिष्ट अपवाद को पकड़ लें जिसकी आप अपेक्षा कर रहे हैं। यही है, यह मत करो:

public void Foo() {
    try {
        //get input from use
        //do calculations
        //open file
    }
    catch (Exception ex) {
       //handle exception
    }
}

इसके बजाय यह करें:

public void Foo() {
    //get input from use
    //do calculations
    try {
        //open file
    }
    catch (FileOpenException ex) {
       //handle exception
    }
}
  • नियंत्रण प्रवाह के लिए अपवादों का उपयोग न करें। उदाहरण के लिए, एक लुकअप डायलॉग में एक ClientNotFoundException को न फेंकें (ऐसा नहीं पाया गया ग्राहक इस स्थिति में असाधारण नहीं है) और कॉल कोड को "ऐसा नहीं होने पर" कोई परिणाम नहीं मिला "" संदेश दिखाने की अपेक्षा करें।

  • अपवादों को न निगलें!

  • ध्यान रखें कि वास्तव में एक अपवाद को संभालने का मतलब केवल 3 चीजें हो सकती हैं:

    1. ऑपरेशन फिर से करें। समस्या क्षणिक होने पर ही मान्य होती है।
    2. एक विकल्प का प्रयास करें।
    3. किसी को समस्या के बारे में सूचित करें। केवल अधिसूचना के कार्रवाई योग्य होने पर ही मान्य है, जिसका अर्थ है कि उपयोगकर्ता इसके बारे में कुछ कर सकता है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.