अभिकथन को उत्पादन कोड में कब रहना चाहिए? [बन्द है]


166

वहाँ पर एक चर्चा comp.lang.c ++ पर चल रही है। इस बारे में संचालित किया गया है कि क्या या नहीं, जो C ++ में केवल डिबग डिफ़ॉल्ट रूप से मौजूद है, उन्हें उत्पादन कोड में रखा जाना चाहिए या नहीं।

जाहिर है, प्रत्येक परियोजना अद्वितीय है, इसलिए मेरा सवाल यहां इतना नहीं है कि क्या जोर दिया जाना चाहिए, लेकिन किन मामलों में यह एक अच्छा विचार नहीं है।

जोर से, मेरा मतलब है:

  • एक रन-टाइम चेक जो एक स्थिति का परीक्षण करता है, जो झूठे होने पर सॉफ्टवेयर में बग का पता चलता है।
  • एक तंत्र जिसके द्वारा कार्यक्रम को रोक दिया जाता है (हो सकता है वास्तव में कम से कम सफाई के बाद काम)।

मैं जरूरी नहीं कि C या C ++ की बात कर रहा हूं।

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

आपकी क्या राय / अनुभव है?

चीयर्स,

कार्ल

संबंधित प्रश्न यहां देखें


जवाब और अपडेट

हे ग्राहम,

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

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

इसलिए, आपको एक जोर के साथ सूचक का परीक्षण करना चाहिए, लेकिन सामान्य त्रुटि-हैंडलिंग कोड के साथ फ़ाइल की उपस्थिति।


थोड़ा ऑफ-टॉपिक, लेकिन चर्चा में एक महत्वपूर्ण बिंदु।

हेड-अप के रूप में, यदि आपके दावे विफल होने पर डिबगर में टूट जाते हैं, तो क्यों नहीं। लेकिन बहुत सारे कारण हैं कि एक फ़ाइल मौजूद नहीं हो सकती है जो आपके कोड के नियंत्रण से पूरी तरह से बाहर हैं: पढ़ने / लिखने के अधिकार, डिस्क पूर्ण, USB डिवाइस अनप्लग्ड, आदि। चूंकि आपके पास इस पर नियंत्रण नहीं है, इसलिए मुझे लगता है कि दावे हैं उससे निपटने का सही तरीका नहीं।

कार्ल


थॉमस,

हां, मेरे पास कोड पूरा है, और मुझे कहना होगा कि मैं उस विशेष सलाह से पूरी तरह असहमत हूं।

अपने कस्टम मेमोरी एलोकेटर को शिकंजा कहें, और मेमोरी का एक हिस्सा ज़ीरो करता है जो अभी भी किसी अन्य ऑब्जेक्ट द्वारा उपयोग किया जाता है। मैं एक पॉइंटर को शून्य करने के लिए होता है जो यह ऑब्जेक्ट नियमित रूप से dereferences करता है, और इनवेरिएंट्स में से एक यह है कि यह पॉइंटर कभी भी अशक्त नहीं है, और आपके पास यह सुनिश्चित करने के लिए कुछ दावे हैं। यदि सूचक अचानक शून्य है तो आप क्या करते हैं। आप बस अगर () इसके चारों ओर, उम्मीद है कि यह काम करता है?

याद रखें, हम यहां उत्पाद कोड के बारे में बात कर रहे हैं, इसलिए डिबगर में कोई तोड़ नहीं है और स्थानीय राज्य का निरीक्षण कर रहा है। यह उपयोगकर्ता की मशीन पर एक वास्तविक बग है।

कार्ल


3
सॉफ्टवेयर इंजीनियरिंग एसई (हालांकि चर्चा सी ++ केंद्रित है) पर एक दिलचस्प संबंधित पोस्ट है: क्या रिलीज बिल्ड में जोर होना चाहिए
सन्नी

जवाबों:


84

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


16
@jkschneider: इकाई परीक्षण कार्यक्रम के कोड के दायरे में चीजों के परीक्षण के लिए हैं। दावे यह सुनिश्चित करने के लिए हैं कि कोड जो वास्तव में सही है, उन मान्यताओं के तहत प्रसंस्करण जारी रखने से पहले कोड वास्तव में सही है। वे इस अर्थ में "प्रलेखन" हैं कि, यदि वे ऐसा नहीं करते हैं, तो यह मामला समाप्त हो जाएगा, इस धारणा को समाप्त कर देगा, और यह संकेत देगा कि यह धारणा पकड़ में नहीं आई। आप कोड में उस के दस्तावेजीकरण के रूप में भी पढ़ सकते हैं, निश्चित रूप से।

2
यह सबसे अच्छा जवाब है क्योंकि यह टिप्पणियों पर जोर देता है, जो उनके बारे में सोचने का एक सहायक तरीका है। वे टिप्पणियों से एक कदम ऊपर हैं क्योंकि उन्हें विकास के दौरान लगातार मशीन परीक्षण किया जाता है, लेकिन उन्हें हमेशा पहले मानव पाठकों के लिए सार्थक होना चाहिए। टिप्पणियों की तरह, उन्हें तर्क या अंतिम निष्पादन का हिस्सा नहीं होना चाहिए। टिप्पणियों की तरह, आप उन्हें छोड़ सकते हैं या उन्हें इस आधार पर निकाल सकते हैं कि भाषा संकलित है या व्याख्या की गई है, आपकी रोल-आउट योजनाएं, आपत्तिजनक रणनीति, आदि। मैंने एक मामला देखा है जहां एक टिप्पणी वास्तव में एक बग का कारण बनी, लेकिन वह थी एक अजीब।
डेवलेले

1
विशेष रूप से, मुखर सूचनात्मक हैं और कार्यात्मक नहीं हैं । प्रोग्राम प्रवाह या परिणामों पर अपने आप में एक असर डालने का कोई प्रभाव नहीं पड़ता है। दूसरी ओर एक अपवाद, कार्यक्रम में परिवर्तन होता है और इस प्रकार परिणाम होता है।
योयो

59

मुझे स्टीव मैककोनेल के कोड को पूरा करने की अनुमति दें। निबंध पर धारा 8.2 है।

आम तौर पर, आप उपयोगकर्ताओं को उत्पादन कोड में संदेश देखना नहीं चाहते हैं; मुख्य रूप से विकास और रखरखाव के दौरान उपयोग के लिए दावे हैं। आम तौर पर विकास के समय में कोड को संकलित किया जाता है और उत्पादन के लिए कोड से बाहर संकलित किया जाता है।

हालाँकि, बाद में उसी सेक्शन में यह सलाह दी जाती है:

अत्यधिक मजबूत कोड के लिए, जोर दें और फिर वैसे भी त्रुटि को संभालें।

मुझे लगता है कि जब तक प्रदर्शन एक मुद्दा नहीं है, तब तक जोर देना छोड़ दें, लेकिन संदेश प्रदर्शित करने के बजाय, इसे लॉग फाइल पर लिखें। मुझे लगता है कि सलाह कोड कम्प्लीट में भी है, लेकिन मैं इसे अभी नहीं पा रहा हूं।


7
मुझे लगता है कि कोड कम्प्लीट से दूसरा भाव यह है कि आपके पास अभिकर्ता होनी चाहिए - जो उत्पादन कोड में संकलित हो जाएगी - और आपको "if (कंडीशन!) {AttemptGracefulRecovery ()};}", यानी डॉन भी होना चाहिए । कार्यक्रम के उल्लंघनकर्ताओं के कार्यक्रम का उल्लंघन न करें।
योयो

34

जब तक आपने माप नहीं लिया है कि प्रोग्राम बंद हो गया है, तब तक उत्पादन कोड में बदल दिया जाना छोड़ दें।

अगर यह अधिक कुशल साबित करने के लिए मापने के लायक नहीं है, तो यह प्रदर्शन जुआ के लिए स्पष्टता को त्यागने के लायक नहीं है। "- स्टीव वुडनेल 1993।

http://c2.com/cgi/wiki?ShipWithAssertionsOn


11
दरअसल, सबसे बुरी बात यह है कि जब कोड किसी ऐसी चीज़ के कारण दुर्घटनाग्रस्त होता है जो मुखर नहीं होती है। यदि कोड निश्चित रूप से 100% संभावना के साथ बाद में दुर्घटनाग्रस्त हो जाएगा, तो मुखर बिल्कुल होना चाहिए। यदि आप एक पॉइंटर को निष्क्रिय करते हैं, तो आपको स्पष्ट रूप से दावा करना होगा कि यह पहले अशक्त नहीं है। यदि आप एक संख्या से विभाजित करते हैं, तो आप दावा करते हैं कि यह शून्य नहीं है। बाहर निकालो और सभी दुर्घटना स्थानों को हटा दिया गया है। वास्तविक समस्या सबसिस्टम को क्रैश होने और प्रहरी द्वारा पुनः आरंभ करने के लिए प्रोग्राम को संरचित नहीं कर रही है।
रोब

5
assert ref != null;इससे भिन्न है कि if (ref == null) throw new IllegalArgumentException();आप पहले से पूर्व शर्त के लिए उपयोग नहीं कर रहे हैं जो गलत हो सकता है। आपको उन assertचीजों के लिए उपयोग करने की आवश्यकता है जो झूठी नहीं हो सकती हैं। उदाहरण, int i = -1 * someNumber; i = i * i;फिर बाद में लोगों को याद दिलाने के लिए कि iसकारात्मक है,assert i > 0;
कप्तान मैन

1
"वास्तव में, सबसे खराब बात यह है कि जब कोड किसी ऐसी चीज़ के कारण क्रैश होता है जो मुखर नहीं होता है। यदि कोड निश्चित रूप से बाद में 100% संभावना के साथ दुर्घटनाग्रस्त हो जाएगा, तो मुखर बिल्कुल होना चाहिए।" - यह एक गलत द्विभाजन है।
रोब ग्रांट

2
@RobertGrant: कई कार्यक्रमों के लिए, दुर्घटनाग्रस्त होना सबसे बुरी चीज है जो हो सकती है। किसी प्रोग्राम के लिए जो किसी बिल्डिंग या ब्रिज की डिज़ाइन की आवाज़ की जाँच करने के लिए माना जाता है, गलत तरीके से यह रिपोर्ट करना कि एक साउंड साउंड हो सकता है, जो कि सबसे खराब चीज़ हो सकती है। एक ऐसे कार्यक्रम के लिए जो बाहरी दुनिया के सामने आता है, लेकिन गोपनीय डेटा तक केवल पढ़ने के लिए पहुँच होती है, उस डेटा को लीक करना उस कार्यक्रम के बारे में कुछ और करने से भी बदतर हो सकता है। यह धारणा कि कारण का कोई सार्थक संकेत के साथ एक दुर्घटना "सबसे बुरी चीज है जो हो सकती है" कई खतरों को नजरअंदाज करती है जो अभी तक बदतर है।
सुपरकैट

@supercat मैं जो टिप्पणी उद्धृत कर रहा था, मैं उससे सहमत नहीं था।
रोब ग्रांट

21

यदि आप उत्पादन पर जोर छोड़ने की सोच रहे हैं, तो आप शायद उनके बारे में गलत सोच रहे हैं। पूरी बात यह है कि आप उन्हें उत्पादन में बंद कर सकते हैं, क्योंकि वे आपके समाधान का हिस्सा नहीं हैं। वे एक विकास उपकरण हैं, जिसका उपयोग यह सत्यापित करने के लिए किया जाता है कि आपकी धारणा सही है। लेकिन जब आप उत्पादन में जाते हैं, तो आपको पहले से ही अपनी मान्यताओं पर विश्वास होना चाहिए।

उस ने कहा, एक ऐसा मामला है जहां मैं उत्पादन पर जोर दूंगा: अगर हम उत्पादन में एक प्रतिलिपि प्रस्तुत करने योग्य बग का सामना करते हैं, तो हम एक कठिन समय का परीक्षण वातावरण में प्रजनन कर रहे हैं, यह बग को फिर से शुरू करने के साथ बग को पुन: पेश करने में मददगार हो सकता है। उत्पादन में, यह देखने के लिए कि क्या वे उपयोगी जानकारी प्रदान करते हैं।

एक और दिलचस्प सवाल यह है: आपके परीक्षण के चरण में, आप दावे कब बंद करते हैं?


4
मुझे लगता है कि अभिकथन को कभी भी उत्पादन कोड में शामिल नहीं किया जाना चाहिए। दावे त्रुटि नहीं हैं, वे डेवलपर्स के लिए डिज़ाइन किए गए हैं। अभिकथन केवल टेस्ट कोड में रहना चाहिए। एप्लिकेशन क्रैश होने के कारण अस्वीकार्य और मैला विकास के दावे और दावे विफल होते हैं। डेवलपर्स को इनायत से त्रुटियों को संभालने के लिए अतिरिक्त मील जाने की आवश्यकता है।
१।

9
यदि यह अपरिहार्य है कि आप एक नुकीले सूचक को fn में पारित कर देंगे, तो आप दुर्घटनाग्रस्त हो जाएंगे; स्पष्ट रूप से इससे निपटने का कोई विकल्प नहीं है। आपके पास या तो किसी तरह से स्थिति को बेहतर तरीके से संभालने का तरीका है (क्योंकि यह बाहरी दुनिया से इनपुट से आ सकता है), या आप एक बेतरतीब स्थान पर एक डॉक्यूमेंटेड स्थान पर दुर्घटनाग्रस्त हो जाते हैं, बजाय एक यादृच्छिक स्थान पर जो रास्ते में भ्रष्ट चीजें हो सकती हैं। हालांकि मुखरता को एक प्रति-मॉड्यूल निर्णय होना चाहिए। हो सकता है कि आपकी वॉचडॉग प्रक्रिया फिर से शुरू हो जाए, या आप उस मॉड्यूल को स्टेट (सॉफ्ट ऑब्जेक्ट "रिबूट") शुरू करने के लिए रीसेट करने के लिए मेमोरी का एक हिस्सा मिटा दें।
रोब

1
मुझे लगता है कि यह दावा करने वालों के उपयोग का एक सीमित दृष्टिकोण है। मैं हमेशा कंसोल और क्लाउड स्टोरेज, दोनों को लॉग इन करता हूं और उत्पादन में छोड़ देता हूं। इस बात की पुष्टि करते हुए कि उत्पादन कोड और उत्पादन उपयोग में भी मेरी धारणा सही है। सिर्फ इसलिए कि कोड डीबग करने में सफलतापूर्वक कुछ समय चला, इसका मतलब यह नहीं है कि उपयोगकर्ताओं को एक ही कोड पथ के माध्यम से विभिन्न मानों को पारित करने का एक तरीका नहीं मिलेगा।
SafeFastExpressive

मुखर कथन का पूरा बिंदु यह है कि आप चेक को चालू या बंद कर सकते हैं। यदि आप उन्हें उत्पादन में छोड़ देते हैं, तो मुखर कथन का उपयोग क्यों करें?
मिग्वेलमुनोज़

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

16

अभिकथन को उत्पादन कोड में कभी नहीं रहना चाहिए । यदि कोई विशेष दावा ऐसा लगता है कि यह उत्पादन कोड में उपयोगी हो सकता है, तो यह एक जोर नहीं होना चाहिए; यह एक रन टाइम एरर चेक होना चाहिए, यानी कुछ इस तरह कोडित होना चाहिए if( condition != expected ) throw exception:।

'जोर' शब्द का अर्थ है "एक विकास-समय-जाँच केवल जो मैदान पर नहीं की जाएगी।"

यदि आप यह सोचना शुरू करते हैं कि दावे क्षेत्र के लिए हो सकते हैं तो आप अनिवार्य रूप से अन्य खतरनाक विचार करना भी शुरू कर देंगे, जैसे कि क्या किसी दिए गए दावे को वास्तव में बनाने लायक है। कोई जोर नहीं है जो बनाने लायक नहीं है। आपको कभी भी अपने आप से यह नहीं पूछना चाहिए "क्या मुझे इस पर जोर देना चाहिए या नहीं?" आपको केवल खुद से पूछना चाहिए "क्या कुछ ऐसा है जिसे मैं बताना भूल गया?"


6

जब तक प्रोफाइलिंग से पता चलता है कि दावे प्रदर्शन की समस्या पैदा कर रहे हैं, मैं कहता हूं कि उन्हें उत्पादन रिलीज में भी रहना चाहिए।

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


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

5

मेरे C ++ में, मैं REQUIRE (x) को परिभाषित करता हूं जो कि assert (x) की तरह है सिवाय इसके कि यह एक अपवाद को फेंकता है यदि रिलीज के निर्माण में जोर विफल होता है।

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

वे कहते हैं कि आपको उन उपयोगकर्ताओं को अंतिम संदेश नहीं दिखाना चाहिए क्योंकि वे उन्हें समझ नहीं पाएंगे। इसलिए? अंतिम उपयोगकर्ता आपको स्क्रीन शॉट या त्रुटि संदेश के कुछ पाठ के साथ एक ईमेल भेज सकते हैं, जो आपको डीबग करने में मदद करता है। यदि उपयोगकर्ता बस "यह दुर्घटनाग्रस्त हो गया" कहता है, तो आपके पास इसे ठीक करने की क्षमता कम है। इंटरनेट पर स्वचालित रूप से अपने आप को जोर-शोर संदेश भेजने के लिए बेहतर होगा, लेकिन यह केवल तभी काम करता है जब उपयोगकर्ता के पास इंटरनेट का उपयोग हो और आप उनकी अनुमति प्राप्त कर सकें।


वे यह भी कहते हैं कि आपको हैकर्स को उन संदेश को नहीं दिखाना चाहिए क्योंकि वे तोड़ने के लिए मूल्यवान सुराग हैं।
डेवलेली

4

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


2

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

उदाहरण के लिए, कुछ अपवाद हैं - PHP, आपको अभिकथन विफलताओं के लिए एक कस्टम हैंडलर बनाने की अनुमति देता है ताकि आप केवल बाहर निकलने के बजाय कस्टम त्रुटियों को प्रदर्शित कर सकें, विस्तृत लॉगिंग आदि कर सकें।


2

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

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

यह कहने के बाद, हम प्रदर्शन-महत्वपूर्ण दिनचर्या में उत्पादन के जोर से बचने की भी कोशिश करते हैं।


5
मैं आपके "प्रोडक्शन एश्योरेंस" को "अपवाद" कहूंगा, और इसे इस तरह से कोड करूंगा।
डेववले

1
आप शायद सही हैं, लेकिन उत्पाद मूल रूप से सी में लिखा गया था। यहां तक ​​कि जब हमने इसे सी ++ में बदल दिया, तो हमारे कुछ प्लेटफार्मों पर हमने जो कंपाइलर का इस्तेमाल किया, वह अपवादों का ठीक से समर्थन नहीं करता था। अधिकांश पुराने कोड को C ++ में दोबारा नहीं लिखा गया था, इसलिए ये दावे अभी भी उपयोग किए जाते हैं।
ग्रीम पेरो

1

मैं इन-लाइन इकाई परीक्षणों के रूप में जोर देता हूं। विकास करते समय एक त्वरित परीक्षण के लिए उपयोगी है, लेकिन अंततः उन अभिकथनों को इकाई परीक्षणों में बाहरी रूप से परीक्षण किया जाना चाहिए।


मुखर: एक तथ्य या विश्वास का वर्णन करें। वे परीक्षण (केवल) के लिए नहीं हैं, लेकिन जो आपको लगता है कि यह सच है (यानी, आपकी धारणाएं) बताते हुए, ताकि आपका कार्यक्रम किसी कारण से गलत न हो जाए। उदाहरण के लिए, यह अभिकथन का एक मान्य उपयोग है: अभिकथन (pow (1,0) <1)। यह वास्तव में त्रुटि जाँच के लिए एक उपयुक्त स्थान नहीं है, क्योंकि यदि यह सच नहीं है, तो आधुनिक गणित के सभी बहुत गलत है, और ... ठीक है, आप इसे कैसे संभालना शुरू करेंगे? गलत धारणा को संभालना कार्यक्रम के दायरे से बाहर है; आप इसे विश्वास में लेते हैं। लेकिन आप वैसे भी सत्यापित करते हैं।

1

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

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

हालाँकि, मान लें कि आपका फ़ोपेन () हमेशा एक वैध, खुली फ़ाइल संभाल के रूप में प्रलेखित है। आप फ़ाइल खोलें, और इसे अपने रीडफ़ाइल () फ़ंक्शन में पास करें।

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

तो, readfile () {assert (fptr! = NULL); ..} इस मामले में उचित है, जबकि फुल-उड़ा त्रुटि हैंडलिंग नहीं है (इस तथ्य को अनदेखा करते हुए कि वास्तव में फ़ाइल को पढ़ने से कुछ त्रुटि हैंडलिंग प्रणाली की आवश्यकता होगी)।

और हां, उन अभिकथनों को उत्पादन कोड में रहना चाहिए, जब तक कि उन्हें अक्षम करने के लिए बिल्कुल आवश्यक न हो। फिर भी, आपको संभवतः उन्हें केवल प्रदर्शन-महत्वपूर्ण अनुभागों के भीतर अक्षम करना चाहिए।


1

मान लीजिए कि कोड का एक टुकड़ा उत्पादन में है, और यह एक जोर मारता है जो सामान्य रूप से चालू हो जाएगा। अभिकथन एक बग मिल गया है! सिवाय इसके कि नहीं, क्योंकि जोर बंद कर दिया है।

तो अब आगे क्या? या तो कार्यक्रम (1) समस्या के स्रोत से आगे निकाले गए बिंदु पर एक असंयमित तरीके से दुर्घटनाग्रस्त हो जाएगा, या (2) गलत तरीके से पूरा होने की संभावना है, गलत परिणाम देगा।

न ही परिदृश्य आमंत्रित है। उत्पादन में भी सक्रियता छोड़ें।


0

मैं शायद ही कभी किसी अन्य चीज के लिए अभिकथन का उपयोग करता हूं जो समय प्रकार की जाँच को संकलित करता है। मैं केवल एक दावे के बजाय एक अपवाद का उपयोग करूंगा क्योंकि अधिकांश भाषाएं उन्हें संभालने के लिए बनाई गई हैं।

मैं एक उदाहरण प्रस्तुत करता हूं

file = create-some-file();
_throwExceptionIf( file.exists() == false, "FILE DOES NOT EXIST");

विरुद्ध

file = create-some-file();
ASSERT(file.exists());

कैसे आवेदन जोर को संभालना होगा? मैं try catchघातक त्रुटियों से निपटने का पुराना तरीका पसंद करता हूं ।


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

0

अधिकांश समय, जब मैं जावा (मुखर कीवर्ड) में अभिकथन का उपयोग करता हूं, तो मैं स्वचालित रूप से कुछ उत्पादन कोड जोड़ देता हूं। मामले के अनुसार, यह एक लॉगिंग संदेश हो सकता है, एक अपवाद ... या कुछ भी नहीं।

मेरे अनुसार, आपके सभी दावे देव रिलीज़ में महत्वपूर्ण हैं, न कि प्रोडक्शन रिले में। उनमें से कुछ को रखा जाना चाहिए, अन्य को छोड़ दिया जाना चाहिए।


0

ASSERTIONS त्रुटियाँ नहीं हैं और उन्हें त्रुटियों के रूप में नियंत्रित नहीं किया जाना चाहिए। जब एक जोर दिया जाता है, तो इसका मतलब है कि आपके कोड में एक बग है या वैकल्पिक रूप से आपके कोड को कॉल करना है।

उत्पादन कोड में जोर देने से बचने के लिए कुछ बिंदु हैं: 1. आप नहीं चाहते कि आपका अंतिम उपयोगकर्ता "ASSERTION विफल MyPStreetClass.cpp लाइन 147 जैसे संदेश देखें। अंतिम उपयोगकर्ता नहीं है आप QA इंजीनियर। 2. ASSERTION हो सकता है। प्रभाव प्रदर्शन

हालांकि, जोर छोड़ने का एक मजबूत कारण है: ASSERTION प्रदर्शन और समय को प्रभावित कर सकता है, और दुख की बात यह है कि कभी-कभी मामला (विशेष रूप से एम्बेडेड सिस्टम में)।

मैं उत्पादन कोड में जोर छोड़ने के लिए वोट देता हूं, लेकिन यह सुनिश्चित करता हूं कि ये दावे प्रिंट आउट उपयोगकर्ता के अंत तक उजागर नहीं होते हैं।

~ Yitzik


नहीं, मान लिया तथ्यों के लिए हैं। यदि हमारा कोड 27 हो जाता है जब यह मान लिया जाता है कि यह हमेशा 25 वापस आएगा, तो समस्या ब्रह्मांड के बारे में हमारी भौतिक धारणाओं में एक बग भी हो सकती है: शायद उन दो बिट्स को 5 संभव मान पर स्विच किया गया था, कंप्यूटिंग के इतिहास में पहली बार। यह पुष्टि करने के लिए कि आपका कोड अभी भी उन मान्यताओं के तहत काम कर रहा है, जिनके लिए यह लिखा गया था। यदि भौतिकी खिड़की से बाहर जाती है, तो आपके कोड को नोटिस करना चाहिए, ड्राइव को अकेले छोड़ दें और आगे रहते हुए छोड़ दें?) लेकिन हां, यह कोड में कोई त्रुटि नहीं है, और आप किस तरह की त्रुटि से निपटने में सक्षम हो सकते हैं?

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

1
इसका मतलब यह नहीं है कि बग है। उदाहरण के लिए, मैं जिन परियोजनाओं में शामिल हूं, उनमें से कई दस्तावेज में ग्रहण किए गए तथ्यों की एक सूची है। उन मान्यताओं को डेवलपर्स के कोड को छोटी गाड़ी कहलाने से बचाया जाता है, जब व्यवसायी लोगों ने उन्हें गलत बात बताई होगी, या जब विशेष रूप से चर के बारे में तीसरे पक्ष से कोई जानकारी उपलब्ध नहीं है। यह सुनिश्चित करने के लिए कि प्रोग्राम को चलाया जाना चाहिए या नहीं चलना चाहिए, यह सुनिश्चित किया जा सकता है कि तृतीय-पक्ष सिस्टम सही हैं, न कि केवल यह कि आईटी सही है।

-8

एक जोर त्रुटि, शुद्ध और सरल है और इसलिए एक की तरह संभाला जाना चाहिए।

चूंकि एक त्रुटि को रिलीज़ मोड में संभाला जाना चाहिए तो आपको वास्तव में अभिकथन की आवश्यकता नहीं है।

मुखरता के लिए मैं जो मुख्य लाभ देख रहा हूं वह एक सशर्त विराम है - वे वीसी की खिड़कियों के माध्यम से ड्रिलिंग करने की तुलना में सेटअप करने में बहुत आसान हैं, जो कि कुछ लाइन को कोड करता है।


2
सशर्त विराम बिंदुओं के रूप में जोर का प्रयोग करना कई कारणों से वास्तव में कष्टप्रद है। सबसे महत्वपूर्ण यह है कि ये दावा करने वाले टीम में अन्य डेवलपर्स को भ्रमित करते हैं - उन्हें कैसे पता चलेगा कि यह त्रुटि है जब उस मुखर को निकाल दिया जाता है या यह है कि किसी ने कोड में अपने सशर्त विराम बिंदु को छोड़ दिया है?
लेगो

अगर पहले स्थान पर कोड में नहीं थे, तो ऐसा नहीं होगा। और यदि आप उन्हें कोड की निगरानी करने के लिए उपयोग कर रहे थे, तो आप उन्हें केवल तब तक देखेंगे जब तक कि (आप उन्हें स्रोत के पेड़ में जाँच नहीं कर रहे थे)। मैंने उन जगहों पर काम किया है, जिनमें व्यावहारिक रूप से सब कुछ है। कार्यक्रम की शुरुआत में लगभग 60 बार क्लिक करने के बाद मदद दस्तावेज उपलब्ध न होने के कारण बहुत जल्दी थक जाता है।
ग्रहाम। प्रात: 9:12
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.