मुझे पायथन में अपवाद कब करना चाहिए?


10

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

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

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

मैं प्रत्येक मामले के लिए कोई तर्क सुनना चाहूंगा।


2
YAGNI ... अब आपको इसकी आवश्यकता नहीं है और आप इसे बाद में बहुत अधिक कठिनाई के बिना जोड़ सकते हैं।
रॉबर्ट हार्वे

क्या आपके पास कोई उदाहरण है? क्या आप केवल Exceptionउदाहरण के लिए, या अधिक विशिष्ट अंतर्निहित त्रुटियों को उठा रहे हैं?
जोंशरशेप

सिर्फ एक अपवाद ("विशिष्ट विवरण") बढ़ाते हुए
एजरा

@ Ezra कम से कम, आपको यह देखना चाहिए कि कहीं अधिक फिटिंग में निर्मित अपवाद है (देखें docs.python.org/2/library/exception.html )।
jonrsharpe

जवाबों:


8

आप सही हे

आपके पक्ष का तर्क रॉबर्ट हार्वे द्वारा पहले ही उल्लेख किया गया है: कोड अभी आप की ज़रूरत नहीं है, खासकर जब से बाद में इसे जोड़ना आसान है।

आपका समीक्षक भी सही है

दूसरी ओर, समीक्षक की बात समझ में आती है:

  • जेनेरिक Exception()को वापस करना कॉलर के लिए बहुत उपयोगी नहीं है: जबकि अपवाद विवरण एक मानव को इंगित करता है कि क्या चल रहा है, अपवादों को अलग-अलग प्रोग्राम के अनुसार व्यवहार करना असंभव हो सकता है। आपके कोड का उपयोग करने वाला डेवलपर कुछ तोड़ने के डर (उचित या नहीं) सहित अपवादों के प्रकारों को बदलने में अनिच्छुक हो सकता है।

    ध्यान दें कि अभी कस्टम अपवाद जोड़ना मुश्किल नहीं है :

    class MyCustomException(Exception):
        pass

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

  • कोड ही बेहतर, अधिक पठनीय लगता है।

    if price < self.PriceMinValue:
        raise OutOfRangeException("The price is inferior to zero.")

    की तुलना में थोड़ा अधिक पठनीय लगता है:

    if price < self.PriceMinValue:
        raise Exception("The price is inferior to zero.")

    अपवाद के प्रकार के संकेत के कारण:

    • कोड के दूसरे भाग में, मुझे विवरण पढ़ने और यह अनुमान लगाने की आवश्यकता है कि मूल्य सीमा से बाहर है (या शायद यह नहीं है? शायद ऐसे मामले हैं जहां कीमत नकारात्मक हो सकती है, जैसे छूट?)

    • कोड के पहले टुकड़े में, प्रकार पर एक झलक त्रुटि के बारे में तत्काल संकेत देती है। ऐसा लगता है कि एक मूल्य के लिए अनुमत मूल्यों का एक सेट है, और वर्तमान मूल्य इस सेट के बाहर है।

इसलिए?

इसलिए:

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

  • अपनी टीम के साथ संगत रहें। यदि आपकी टीम कस्टम अपवादों का बड़े पैमाने पर उपयोग करती है, तो उनका उपयोग करें।


2
लेकिन एक खुशहाल माध्यम है raise ValueError('The price is less than zero'):। यह आधार से अधिक विशिष्ट है Exception, लेकिन बिना किसी उपद्रव के।
जोंशरशेप

+1 सरल कथन के लिए "सुसंगत रहें", एक टीम के साथ यदि आपके पास एक है, यदि आप नहीं हैं तो अपने आप के साथ।
18yn में Styne666
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.