पुस्तक का मुख्य तर्क यह है कि कोड का अपवाद संस्करण बेहतर है क्योंकि यह कुछ भी पकड़ लेगा जिसे आपने अनदेखा कर दिया होगा यदि आपने अपनी त्रुटि जाँच लिखने की कोशिश की थी।
मुझे लगता है कि यह कथन केवल बहुत विशिष्ट परिस्थितियों में सच है - जहां आउटपुट सही है, तो आपको परवाह नहीं है।
इसमें कोई संदेह नहीं है कि अपवादों को उठाना एक ध्वनि और सुरक्षित अभ्यास है। जब भी आपको लगे कि कार्यक्रम की वर्तमान स्थिति में ऐसा कुछ है जिसे आप (एक डेवलपर के रूप में) कर सकते हैं, या नहीं करना चाहते, तो आपको ऐसा करना चाहिए।
हालाँकि, आपका उदाहरण अपवादों को पकड़ने के बारे में है। यदि आप एक अपवाद को पकड़ते हैं, तो आप अपने आप को उन परिदृश्यों से बचा नहीं रहे हैं जिन्हें आप अनदेखा कर सकते हैं। आप ठीक इसके विपरीत कर रहे हैं: आप मानते हैं कि आपने इस प्रकार के अपवाद के कारण हो सकने वाले किसी भी परिदृश्य को अनदेखा नहीं किया है, और इसलिए आप आश्वस्त हैं कि इसे पकड़ना ठीक है (और इस प्रकार प्रोग्राम को बाहर निकलने से रोकें किसी भी अनकहा अपवाद के रूप में) होगा।
अपवाद दृष्टिकोण का उपयोग करते हुए, यदि आप ValueError
अपवाद देखते हैं, तो आप एक पंक्ति छोड़ते हैं। पारंपरिक गैर-अपवाद दृष्टिकोण का उपयोग करते हुए, आप से लौटे मानों की संख्या की गणना करते हैं split
, और यदि यह 2 से कम है, तो आप एक पंक्ति को छोड़ देते हैं। क्या आपको अपवाद दृष्टिकोण के साथ अधिक सुरक्षित महसूस करना चाहिए, क्योंकि आप अपनी पारंपरिक त्रुटि जांच में कुछ अन्य "त्रुटि" स्थितियों को भूल गए except ValueError
होंगे , और उन्हें आपके साथ पकड़ लेंगे?
यह आपके प्रोग्राम की प्रकृति पर निर्भर करता है।
यदि आप लिख रहे हैं, उदाहरण के लिए, एक वेब ब्राउज़र या एक वीडियो प्लेयर, इनपुट के साथ एक समस्या यह एक बिना किसी अपवाद के क्रैश होने का कारण नहीं होना चाहिए। दूर से समझदार (भले ही सख्ती से बोलना, गलत हो) कुछ उत्पादन करने के लिए बेहतर है।
यदि आप एक ऐसा एप्लिकेशन लिख रहे हैं जहाँ शुद्धता मायने रखती है (जैसे कि व्यवसाय या इंजीनियरिंग सॉफ़्टवेयर), तो यह एक भयानक दृष्टिकोण होगा। यदि आप किसी ऐसे परिदृश्य के बारे में भूल गए हैं ValueError
, जो सबसे खराब है, तो आप जो सबसे बुरा काम कर सकते हैं, वह है इस अज्ञात परिदृश्य को चुपचाप अनदेखा करना और केवल रेखा को छोड़ना। यह बहुत ही सूक्ष्म और महंगा बग सॉफ्टवेयर में समाप्त होता है।
आप सोच सकते हैं ValueError
कि इस कोड में आप एक ही रास्ता देख सकते हैं , यदि split
केवल एक मान (दो के बजाय) वापस किया जाए। लेकिन क्या होगा अगर आपका print
बयान बाद में ValueError
कुछ शर्तों के तहत उठने वाली अभिव्यक्ति का उपयोग करना शुरू कर दे ? यह आपको कुछ पंक्तियों को छोड़ने का कारण बनेगा क्योंकि वे याद नहीं करते हैं :
, लेकिन क्योंकि print
उन पर विफल रहता है। यह एक सूक्ष्म बग का उदाहरण है जिसका मैं पहले उल्लेख कर रहा था - आप कुछ भी नोटिस नहीं करेंगे, बस कुछ लाइनें खो देंगे।
मेरी सिफारिश कोड को पकड़ने (लेकिन नहीं बढ़ाने!) से बचने के लिए है, जहां गलत आउटपुट का उत्पादन बाहर निकलने से भी बदतर है। इस तरह के कोड में अपवाद को पकड़ने का एकमात्र समय है जब मेरे पास वास्तव में तुच्छ अभिव्यक्ति है, इसलिए मैं आसानी से संभावित अपवाद प्रकारों में से प्रत्येक का कारण बन सकता हूं।
अपवादों के उपयोग के प्रदर्शन प्रभाव के रूप में, यह तुच्छ (पायथन में) है जब तक कि अपवाद अक्सर सामने नहीं आते हैं।
यदि आप नियमित रूप से होने वाली परिस्थितियों को संभालने के लिए अपवादों का उपयोग करते हैं, तो आप कुछ मामलों में भारी प्रदर्शन लागत का भुगतान कर सकते हैं। उदाहरण के लिए, मान लीजिए कि आप दूरस्थ रूप से कुछ कमांड निष्पादित करते हैं। आप जांच सकते हैं कि आपका कमांड टेक्स्ट कम से कम न्यूनतम सत्यापन (जैसे, वाक्यविन्यास) पास करता है। या आप एक अपवाद को उठाए जाने की प्रतीक्षा कर सकते हैं (जो दूरस्थ सर्वर द्वारा आपकी कमांड को पार्स करने के बाद ही होता है और इसके साथ कोई समस्या आती है)। जाहिर है, पूर्व में तेजी के परिमाण के आदेश हैं। एक और सरल उदाहरण: आप जांच कर सकते हैं कि क्या कोई संख्या शून्य से 10 गुना अधिक है, विभाजन को अंजाम देने और फिर ZeroDivisionError अपवाद को पकड़ने की तुलना में तेजी से।
ये विचार केवल तभी मायने रखते हैं जब आप अक्सर विकृत सर्वर स्ट्रिंग्स को दूरस्थ सर्वरों को भेजते हैं या शून्य-मूल्यवान तर्क प्राप्त करते हैं जो आप विभाजन के लिए उपयोग करते हैं।
नोट: मेरा मानना है कि आप except ValueError
बस के बजाय उपयोग करेंगे except
; जैसा कि अन्य लोगों ने बताया, और जैसा कि पुस्तक स्वयं कुछ पृष्ठों में कहती है, आपको कभी भी नंगे का उपयोग नहीं करना चाहिए except
।
एक और नोट: उचित गैर-अपवाद दृष्टिकोण के लिए split
खोज के बजाय, द्वारा लौटाए गए मूल्यों की संख्या की गणना करना है :
। उत्तरार्द्ध बहुत धीमा है, क्योंकि यह द्वारा किए गए कार्य को दोहराता है split
और निष्पादन समय को लगभग दोगुना कर सकता है।