अपवादों को फेंकने के दावे का उपयोग करना?


38

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

तो मुझे कब करना चाहिए: जब एक दावे का उपयोग करना उचित है और अपवाद को फेंकना कब उचित है?


3
मुझे लगता है कि यह सवाल स्टैकओवरफ्लो पर पूछा जाना चाहिए, हालांकि यह संभवतः वहां एक दर्जन बार पूछा गया है, इसलिए आपको पहले से ही वहां कई उत्तर मिल सकते हैं।
user281377

जवाबों:


50

कथनों का उपयोग केवल उन स्थितियों को सत्यापित करने के लिए किया जाना चाहिए जो तार्किक रूप से गलत होने के लिए असंभव होनी चाहिए (पढ़ें: पवित्रता की जाँच)। ये स्थितियां केवल आपके स्वयं के कोड द्वारा उत्पन्न इनपुट पर आधारित होनी चाहिए। बाहरी इनपुट के आधार पर किसी भी चेक को अपवादों का उपयोग करना चाहिए।

एक सरल नियम जिसका मैं पालन करता हूं, वह निजी कार्यों के तर्कों का सत्यापन कर रहा है, और सार्वजनिक / संरक्षित कार्यों के तर्कों के अपवादों का उपयोग कर रहा है।


बाहरी आदानों के लिए अपवादों का उपयोग करने के बारे में अच्छी बात। समस्याओं लिखने फ़ाइल / डेटाबेस आदि के लिए जब बनाने का प्रयास कर / - मैं भी आउटपुट से वह भी जोड़ना होगा
ChrisF

13
और अनिवार्य रूप से आप पाएंगे कि उत्पादन में जोर दिया जा रहा है। +1 निजी सामानों के सत्यापन के लिए ! शायद आप कह सकते हैं "जब आप इनपुट्स के पूर्ण नियंत्रण में होते हैं, तो ऐसेट्स का उपयोग करें"?
फ्रैंक शीयर

1
जावा में, कम से कम, आपको आम तौर पर -ea कमांड लाइन पैरामीटर के साथ अभिकथन जांच सक्षम करना होगा। इसका मतलब यह है कि जब तक आप स्पष्ट रूप से उन्हें चालू नहीं करते हैं तब तक दावे प्रभावी रूप से नहीं होते हैं।
बिल माइकेल

29

प्रोग्रामिंग त्रुटियों को खोजने के लिए अभिकथन का उपयोग किया जाता है। आपके कार्यक्रमों को ठीक वैसे ही काम करना चाहिए जब सभी दावे हटा दिए जाएं।

दूसरी ओर, अपवाद उन स्थितियों के लिए हैं जो प्रोग्राम के सही होने पर भी हो सकते हैं; वे बाहरी प्रभावों के कारण होते हैं, जैसे हार्डवेयर, नेटवर्क, उपयोगकर्ता आदि।


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

3

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

सी में उदाहरण के लिए,

int printf(const char *fmt, ...)
{
  assert(fmt);  // may fail in debug build but not in production build
  if (!fmt) return -1; // handle gracefully in production build
  ...
}

अपवाद का निर्माण उत्पादन में बनाया जाता है। अपवाद का विकल्प त्रुटि लौटा रहा है और दावे नहीं।


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

0

मेरे लिए मुखरता के साथ एक समस्या यह है कि वे जावा में डिफ़ॉल्ट रूप से अक्षम हैं।

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

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