मैं अपनी त्रुटि जाँच और हैंडलिंग कैसे सुधार सकता हूँ?


13

हाल ही में मैं यह समझने के लिए संघर्ष कर रहा हूं कि सही मात्रा क्या है और उचित तरीके क्या हैं।

इस बारे में मेरे कुछ सवाल हैं:

त्रुटियों (खराब इनपुट, खराब स्थिति, आदि) की जांच करने का उचित तरीका क्या है? क्या त्रुटियों के लिए स्पष्ट रूप से जांच करना बेहतर है, या एस्कॉर्ट्स जैसे कार्यों का उपयोग करें जिन्हें आपके अंतिम कोड से अनुकूलित किया जा सकता है? मुझे ऐसा लगता है कि बहुत सारे अतिरिक्त कोड के साथ एक कार्यक्रम को स्पष्ट रूप से चेक किया जा रहा है, जिसे वैसे भी अधिकांश स्थितियों में निष्पादित नहीं किया जाना चाहिए- और सबसे अधिक त्रुटियों का उल्लेख करना एक गर्भपात / निकास विफलता के साथ समाप्त होता है। सिर्फ स्पष्ट गर्भपात के साथ एक फ़ंक्शन को अव्यवस्थित क्यों करें? मैंने त्रुटियों की स्पष्ट जाँच के लिए जोर दिया है और पाया है कि कब क्या करना है।

अधिकांश का कहना है कि '' तर्क की त्रुटियों की जाँच करने के लिए और अन्य विफलताओं की जाँच करने के लिए स्पष्ट जाँचों का उपयोग करने के लिए ज़ोर का प्रयोग करें। '' हालांकि यह हमें बहुत दूर नहीं लगता है। क्या हम कहेंगे कि यह संभव है:

Malloc returning null, check explictly
API user inserting odd input for functions, use asserts

क्या इससे मुझे त्रुटि जाँच में कोई सुधार होगा? मैं और क्या कर सकता हुँ? मैं वास्तव में बेहतर और 'पेशेवर' कोड लिखना चाहता हूं।


3
अच्छा सवाल है, लेकिन मुझे लगता है कि यह बहन साइटों (प्रोग्रामर?) में से एक के लिए बेहतर अनुकूल हो सकता है।

धन्यवाद, मुझे यकीन नहीं था। मैंने सोचा था कि यह बहुत कोड से संबंधित था तो ठीक हो गया होता।
अनॉन

3
सरल उत्तर है "यही कारण है कि अपवाद का आविष्कार किया गया था। एक बेहतर भाषा प्राप्त करें।"
डेडएमजी

1
@DeadMG: setjmp/ longjmpC में उपलब्ध हैं, इसलिए आपको नई भाषा की आवश्यकता नहीं है।
user786653 17

3
@ डीडएमजीएम: कोई है जो सी त्रुटि की जांच नहीं कर सकता है उसे नरक में एक स्नोबॉल का मौका मिल रहा है सी + + अपवाद को सही तरीके से संभाल रहा है ...
कोडर

जवाबों:


4

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


2

किसी भी समय कुछ भी जांचें (यह आपकी अंतिम जांच के बाद बदल सकता है) जो आपकी आज्ञा के तहत 100% नहीं है । और यह भी: विकास के दौरान भी अपने आप पर भरोसा मत करो! ;-)

ओकोकॉक ... "कुछ भी" का मतलब ऐसी चीज़ों की जाँच के रूप में पढ़ा जाता है जो एक असामान्य गर्भपात का कारण बनती हैं या ऐसा कुछ भी जो आपके एप्लिकेशन / सिस्टम को ऐसी चीजें करने में सक्षम बना सकता है जो उसे नहीं करना चाहिए ।

गंभीर होने के लिए, अंतिम वाक्य का अंतिम भाग आवश्यक है क्योंकि यह मुख्य मुद्दे की ओर इशारा करता है:

आप एक स्थिर प्रणाली मुख्य चिंता यह क्या प्रणाली क्या करना चाहिए के बारे में नहीं निर्माण करने के लिए है, लेकिन यह इस तरह के अनिवार्य चीजें एक की जरूरत है ऐसा करने के लिए, यह होना चाहिए कि की देखभाल करने में सक्षम हो जाने के लिए चाहते हैं नहीं , ऐसा तो भी यह "clutters अपने कोड "।


1
+1 'सब कुछ जांचें' के लिए। मैं कोड अव्यवस्था के तर्क को नहीं खरीदता: किसी भी प्रोग्रामर को वैसे भी त्रुटि जाँच और वास्तविक तर्क के बीच अंतर करने में सक्षम होना चाहिए।
stijn

2

त्रुटि से निपटने का क्रूज़ यह नहीं है कि आप मुसीबत को कैसे और कैसे पकड़ते हैं। इसके बारे में जानने के बाद आप इसे करते हैं

सबसे पहले - मैं कहूंगा, कोई कारण नहीं है कि अधीनस्थ विधि द्वारा लौटाए गए किसी भी एक त्रुटि को वापस नहीं किया जाना चाहिए। और त्रुटियां और अपवाद रिटर्न वैल्यू से अधिक हैं या सभी कोशिश / पकड़ हैं।

  1. सिर्फ फेंकना और पकड़ना काफी नहीं है।
    इसे देखें : जहां लेखक समझाता है कि बस पकड़ कर लेकिन संभावित रूप से कुछ भी अपवाद को नहीं दबाता है और जब तक नुकसान को पूर्ववत करने के लिए पर्याप्त नहीं किया जाता है - यह कोड को उसी तरह से जाने देने से भी बदतर है। इसी तरह "लॉग" स्टेटमेंट लिखने पर जब कोई फाइल ओपन होती है या रीड एरर की वजह पता लगाने में मदद मिल सकती है - लेकिन जब तक प्रोग्राम समाप्त हो जाता है, तब तक डेटा खराब हो सकता है! यह कहने के लिए पर्याप्त नहीं है कि मेरे पास कई प्रयास / कैच हैं - यह जानना अधिक महत्वपूर्ण है कि वे वास्तव में क्या करते हैं!

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

  3. परिभाषित करें कि कौन जिम्मेदार है:
    पहली चीज जो आपको करनी चाहिए, वह यह परिभाषित करना है कि क्या रूटीन को दिया गया इनपुट केवल एक अस्वीकार्य है (या अब तक संभाला नहीं गया है) या पर्यावरण के कारण अपवाद है (जैसे सिस्टम इश्यू, मेमोरी इश्यू), या यह स्थिति एल्गोरिदम के परिणाम से पूरी तरह से आंतरिक उत्पन्न होती है। सभी मामलों में - जिस स्तर पर आप वापस जाना चाहते हैं या कार्रवाई करना चाहते हैं वह काफी अलग है। इस प्रकाश में मैं यह कहना चाहूंगा - कि जब आप उत्पादन में कोड चलाते हैं - प्रोग्राम से बाहर निकलने के लिए एबॉर्ट (बनाना) अच्छा है - लेकिन हर छोटी चीज़ के लिए नहीं। यदि आप स्मृति भ्रष्टाचार या स्मृति से बाहर हैं, तो यह निश्चित है कि अपना सर्वश्रेष्ठ करने के बाद भी - चीजें मर जाएँगी। लेकिन अगर आपको इनपुट पर एक NULL पॉइंटर मिलता है - तो मैं '

  4. परिभाषित करें कि सबसे अच्छा संभव परिणाम
    क्या है : अपवाद के तहत सभी चीजें क्या होनी चाहिए, यह बहुत महत्वपूर्ण है। उदाहरण के लिए यदि हमारे किसी एक मामले में - एक मीडिया प्लेयर पाता है कि उसके पास पूरा डेटा नहीं है जो उपयोगकर्ता को चलाया जाए - तो यह क्या करना चाहिए?

    • या तो कुछ बुरा हिस्सा छोड़ें और देखें कि क्या यह अच्छी चीजों के साथ आगे बढ़ सकता है।
    • यदि ऐसा होता है, तो बहुत विचार करें कि क्या यह अगले गीत पर जा सकता है।
    • अगर यह पता चलता है कि यह किसी भी फ़ाइल को पढ़ने में सक्षम नहीं है - रोकें और कुछ दिखाएं।
    • इस दौरान
    • किस राज्य के तहत उपयोगकर्ता को एक खिलाड़ी POP-UP होना चाहिए और
    • इसे कब अपने दम पर ले जाना चाहिए?
    • क्या उपयोगकर्ता को वापस फीड करने के लिए चीजों को "रोकना" चाहिए
    • या यह किसी कोने में विनीत थोड़ा त्रुटि नोट करना चाहिए?

    ये सभी व्यक्तिपरक हैं - और शायद हम तुच्छ चीज़ों की तुलना में समस्याओं को संभालने के अधिक तरीके हैं। उपरोक्त सभी को अपवाद की गहराई को बनाने और समझने की आवश्यकता है और इससे अलग परिदृश्य बनाने के लिए भी विकसित होना संभव है।

  5. कभी-कभी हमें उठने से पहले अपवादों की जाँच करने की आवश्यकता होती है। सबसे आम उदाहरण शून्य त्रुटि से विभाजित है। आदर्श रूप से किसी को परीक्षण करना चाहिए कि इससे पहले कि इस तरह के अपवाद को फेंक दिया जाए - और अगर ऐसा है तो- सबसे उपयुक्त गैर-शून्य मान डालने की कोशिश करें और आत्महत्या करने के बजाय आगे बढ़ें!

  6. साफ - सफाई। कम से कम यह तो आपको करना ही चाहिए! यदि एक फ़ंक्शन 3 फ़ाइलों को खोलने के लिए होता है और चौथा एक खोलने में विफल रहता है - यह कहने के लिए अनावश्यक है कि पहले 3 को बंद कर दिया जाना चाहिए था। इस नौकरी को एक परत के ऊपर सौंपना एक बुरा विचार है। यदि आप स्मृति को साफ किए बिना छोड़ने का निर्णय लेते हैं। और सबसे महत्वपूर्ण - भले ही आप अपवाद से बचे हों, उच्च को सूचित करें कि चीजों ने सामान्य पाठ्यक्रम नहीं लिया है।

जिस तरह से हम विभिन्न पदानुक्रमों या परतों या सार के संदर्भ में सॉफ़्टवेयर की कार्यक्षमता (सामान्य) देखते हैं, उसी तरह हमें उनकी गंभीरता के साथ-साथ उन अपवादों को भी वर्गीकृत करना होगा जिनके तहत वे उत्पन्न होते हैं और वे सिस्टम के अन्य भागों को प्रभावित कर रहे हैं - जो परिभाषित करता है इस तरह के अलग-अलग अपवादों को सर्वोत्तम तरीके से कैसे संभालें।

सर्वश्रेष्ठ संदर्भ: कोड क्राफ्ट अध्याय 6 - डाउनलोड के लिए उपलब्ध


1

डीबग बिल्ड के दौरान त्रुटियों की जाँच करना केवल एक BAD IDEA (tm) है, जो स्टैक पर पुन: उपयोग किए जाने योग्य ओवरलेबल वैरिएबल के अंतर्गत संकलन करता है, गार्ड पेज हटाता है, गणना के साथ iffy ट्रिक करता है, पूर्वनिर्मित शिफ्ट में भारी आर्थथिक्स को प्रतिस्थापित करता है।

रिलीज में त्रुटि जांच का उपयोग करें, आप सरल के रूप में कुछ का सहारा ले सकते हैं:

if(somethinghitthefan)
     abort();

यह भी एक बहुत अच्छा साइड इफेक्ट है कि आप निश्चित रूप से बग को नजरअंदाज नहीं करेंगे, जब एक बार betta परीक्षकों के पीसी पर क्रैश शुरू हो जाएगा।

इवेंट व्यूअर और लॉग पूरी तरह से बेकार हैं abort(), जो उन्हें वैसे भी चेक करता है?


बाहर निकलें / गर्भपात == सबसे खराब उपयोगकर्ता अनुभव: आवेदन बिना बताए गायब हो जाता है ..
stijn

@stijn: abortडिबगर में टूट जाता है / एक डंप बनाता है। exitबुरा है, हाँ। हालांकि, मैं __asm int 3सबसे ज्यादा पसंद करता हूं ।
कोडर

यह सच है, और C / C ++ में मैं __asm ​​int 3 का उपयोग करके asserts लिखना पसंद करता हूं, लेकिन कभी भी कम से कम क्यों, और अधिमानतः भी लाइन और फ़ाइल का विवरण दिखाए बिना। फिर कम से कम ग्राहक इसके बारे में जानकारी दे सकता है कि वास्तव में क्या हुआ था।
टिजिन

0

विभिन्न चीजें जो आप कर सकते हैं,
1.Read और ऑनलाइन बहुत कोड को आत्मसात करें और देखें कि यह कैसे किया जाता है।
2. डिबगिंग टूल का उपयोग करें ताकि आप त्रुटियों के क्षेत्रों का पता लगाने में मदद कर सकें।
3. अनुचित कार्य के कारण तुच्छ त्रुटियों के बारे में जानें। वाक्यविन्यास त्रुटियाँ।
4. प्रोग्राम में तार्किक त्रुटियों के कारण कुछ बदतर त्रुटियां उत्पन्न होती हैं, जिन्हें खोजना कठिन होता है। इसके लिए आप इसे कलमबद्ध कर सकते हैं और अधिक जटिल लोगों के लिए बोलने की कोशिश कर सकते हैं या इसके लिए Stackoverflow , Wikipedia , google जैसे संसाधनों का उपयोग कर सकते हैं। लोग।

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