पायथन अपवाद "त्रुटि" क्यों हैं?


82

क्यों अजगर अपवाद नाम हैं (उदाहरण के लिए "त्रुटि" ZeroDivisionError, NameError, TypeError) और नहीं "अपवाद" (उदाहरण के लिए ZeroDivisionException, NameException, TypeException)।

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

पाइथन में भी अंतर है या नहीं?

जवाबों:


95
  1. आप प्रत्येक वर्ग को नाम में 'वर्ग' और नाम के साथ 'चर' के साथ प्रत्येक चर का नाम नहीं देते हैं। इसी तरह से आप अपवाद का नाम 'अपवाद' का उपयोग नहीं करते हैं। एक नाम को किसी वस्तु के अर्थ के बारे में कुछ कहना चाहिए। Ions त्रुटि ’अधिकांश अपवादों का अर्थ है।

  2. सभी अपवाद त्रुटियां नहीं हैं। SystemExit, KeyboardInterrupt, StopIteration, GeneratorExitसभी अपवादों और नहीं त्रुटियाँ हैं। वास्तविक त्रुटियों में 'त्रुटि' शब्द अंतर दिखाता है।

  3. 'त्रुटि' 'अपवाद' से छोटी है। कोड चौड़ाई में कुछ अक्षर बचा सकते हैं जिसका अर्थ में कोई नुकसान नहीं है। इससे कुछ फर्क पड़ता है।


2
सभी अपवाद अपवाद नहीं हैं : वास्तव में, कई अपवाद हैं जो नामांकित अपवाद वर्ग से प्राप्त होते हैं Warning। कृपया मेरा उत्तर देखें ।
18

1
यह एक महान दृश्य है docs.python.org/2/library/exception.html#exception-hierarchy
जेसन

1
Python3 के लिए अप-टू-डेट विज़ुअलाइज़ेशन यहाँ है: docs.python.org/3.6/library/exception.html#exception-hierarchy
सेबेस्टियन ज्येलंकी

49

मेरा मानना ​​है कि यह सम्मेलन PEP 8 से आता है - पायथन कोड के लिए स्टाइल गाइड :

अपवाद नाम

क्योंकि अपवाद वर्ग होना चाहिए, वर्ग नामकरण सम्मेलन यहां लागू होता है। हालांकि, आपको अपने अपवाद नामों पर प्रत्यय "त्रुटि" का उपयोग करना चाहिए (यदि अपवाद वास्तव में एक त्रुटि है)।


8

इस संबंध में अजगर जावा के समान है। लेकिन पायथन के अपवाद की तुलना जावा के थ्रोबेबल से की जानी चाहिए।

जैसा कि थ्रोबेबल्स सभी प्रकार के स्वादों में आते हैं - त्रुटि, रनटाइम एक्ससेप्शन और (चेक किए गए) अपवाद - तो पायथन के (हालांकि कोई चेक किए गए अपवाद नहीं हैं)।

भाषा के लिए, एक त्रुटि असाधारण है, ताकि विरासत पदानुक्रम अजीब न हो।

मुझे विशेष रूप से नाम अपवाद पसंद नहीं है। अपवादों का उपयोग केवल असाधारण परिस्थितियों (जैसे उम्मीद की त्रुटियां) के लिए ही नहीं किया जाता है, बल्कि नियंत्रण प्रवाह से बाहर निकलने के लिए भी किया जाता है। क्योंकि एक अपवाद क्या करता है; यह नियंत्रण के सामान्य प्रवाह से एक चिह्नित बिंदु तक कूदता है। एक गोटो की तरह थोड़ा, लेकिन अधिक परिष्कृत।

कहा कि, हर बार आपके पास एक ऐसी स्थिति होती है जिसमें कोई उपयुक्त वापसी मूल्य नहीं मिल सकता है जो आप अपवाद का उपयोग करते हैं। दोनों पायथन में जावा के रूप में।


-1; मुझे नहीं लगता कि यह कोई उपयोगी जानकारी प्रदान करता है। आप उन्हें स्पष्ट रूप से परिभाषित किए बिना 'असाधारण परिस्थितियों' के बारे में बात करते हैं, आप इस बात का विवरण देते हैं कि अपवाद कैसे काम करते हैं ("एक चिह्नित बिंदु पर नियंत्रण के सामान्य प्रवाह से बाहर कूदें") जो वास्तव में सटीक नहीं है, आप त्रुटि और के बीच के अंतर को आमंत्रित करते हैं। जावा में RuntimeException मानो पायथन में कुछ समान अंतर मौजूद है (यह नहीं है), और आप वास्तव में कभी भी इस सवाल का जवाब नहीं देते हैं कि पायथन के अपवाद अक्सर Errorउनके नाम पर क्यों होते हैं ।
मार्क एमी

4

Q. पायथन अपवादों को "त्रुटि" क्यों कहा जाता है?

मैं इसका कारण यह हूं कि अधिकांश पायथन अपवादों को या तो त्रुटियों या चेतावनियों के रूप में वर्गीकृत किया गया है । यदि पायथन अपवादों के नाम के साथ समाप्त होता है Exception, तो यह अंतर संभव नहीं होगा।

चेतावनियों के उदाहरण हैं DeprecationWarningऔर ImportWarning

कृपया 2.x वर्ग पदानुक्रम को अंतर्निहित अपवादों के लिए और साथ ही 3.x के लिए देखें


3

सीधे शब्दों में कहें:

  • पायथन अपवादों को "त्रुटि" का नाम नहीं दिया गया है।
  • पायथन त्रुटियों को "त्रुटि" नाम दिया गया है।
  • अपवाद के रूप में पायथन त्रुटियों को उठाया जा सकता है, पकड़ा जा सकता है और नियंत्रित किया जा सकता है।
  • त्रुटि के रूप में शुरू होने वाले कुछ को एक अपवाद के रूप में समाप्त किया जा सकता है जिसके परिणामस्वरूप त्रुटि संदेश नहीं होता है।
  • एक Exceptionभी सीधे उठाया जा सकता है

संकल्पना:

मैं आम तौर पर इस बात को करता हूं, लेकिन मैं एक अपवाद बनाने जा रहा हूं

या

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

विवरण:

अपवाद बनाम त्रुटियां:

https://docs.python.org/2/tutorial/errors.html

निष्पादन के दौरान पाई गई त्रुटियों को अपवाद कहा जाता है और यह बिना शर्त घातक नहीं हैं

कार्यप्रवाह:

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

1

यह सिर्फ नामकरण है। जावा में, आप java.lang.Errorअन्य Throwableएस से अलग हैं क्योंकि उन प्रकार की त्रुटियों को अनियंत्रित करने की आवश्यकता है। पायथन में, सभी अपवाद अनियंत्रित हैं, इसलिए भेद एक प्रकार का व्यर्थ है।


बेस क्लास को अपवाद कहा जाता है (अन्य उत्तर पर मेरी टिप्पणी देखें) तो बच्चों का नाम अपवाद भी क्यों नहीं है?
ऐलेना

@ एलीना: क्योंकि तब आप अंत में कुछ इस तरह से समाप्त हो जाएंगे class ExceptionHandlingException extends RuntimeExceptionऔर यह पढ़ने के लिए सिर्फ भयानक है।
एस्को

2
दूसरों द्वारा पोस्ट किए गए अन्य कारणों के अलावा, ध्यान रखें कि पायथन मानक पुस्तकालय में नामकरण हमेशा सुसंगत नहीं है।
gustafc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.