अपवाद और अपवाद कक्षाएं

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

अपवाद संभालना आपको त्रुटियों को इनायत से संभालने में सक्षम बनाता है और इसके बारे में कुछ सार्थक करता है। अपवाद हैंडलिंग के दो घटक हैं: "फेंकना" और 'पकड़ना'।

अपवाद की पहचान करना (त्रुटियां)

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

>>> #Exception
>>> 1/0
Traceback (most recent call last):
   File "<pyshell#2>", line 1, in <module>
      1/0
ZeroDivisionError: division by zero
>>>
>>> var = 20
>>> print(ver)
Traceback (most recent call last):
   File "<pyshell#5>", line 1, in <module>
      print(ver)
NameError: name 'ver' is not defined
>>> #Above as we have misspelled a variable name so we get an NameError.
>>>
>>> print('hello)

SyntaxError: EOL while scanning string literal
>>> #Above we have not closed the quote in a string, so we get SyntaxError.
>>>
>>> #Below we are asking for a key, that doen't exists.
>>> mydict = {}
>>> mydict['x']
Traceback (most recent call last):
   File "<pyshell#15>", line 1, in <module>
      mydict['x']
KeyError: 'x'
>>> #Above keyError
>>>
>>> #Below asking for a index that didn't exist in a list.
>>> mylist = [1,2,3,4]
>>> mylist[5]
Traceback (most recent call last):
   File "<pyshell#20>", line 1, in <module>
      mylist[5]
IndexError: list index out of range
>>> #Above, index out of range, raised IndexError.

पकड़ना / फँसाना अपवाद

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

वाक्य - विन्यास

try:
   #write some code
   #that might throw some exception
except <ExceptionType>:
   # Exception handler, alert the user

प्रयास खंड के भीतर कोड को स्टेटमेंट द्वारा निष्पादित किया जाएगा।

यदि कोई अपवाद होता है, तो शेष ब्लॉक को छोड़ दिया जाएगा और अपवाद को छोड़ दिया जाएगा।

try:
   some statement here
except:
   exception handling

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

number = int(input('Please enter the number between 1 & 10: '))
print('You have entered number',number)

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

Please enter the number between 1 > 10: 'Hi'
Traceback (most recent call last):
   File "C:/Python/Python361/exception2.py", line 1, in <module>
      number = int(input('Please enter the number between 1 & 10: '))
ValueError: invalid literal for int() with base 10: "'Hi'"

अब ValueError एक अपवाद प्रकार है। आइए अपवाद हैंडलिंग के साथ उपरोक्त कोड को फिर से लिखने की कोशिश करें।

import sys

print('Previous code with exception handling')

try:
   number = int(input('Enter number between 1 > 10: '))

except(ValueError):
   print('Error..numbers only')
   sys.exit()

print('You have entered number: ',number)

यदि हम प्रोग्राम चलाते हैं, और एक स्ट्रिंग (एक संख्या के बजाय) दर्ज करते हैं, तो हम देख सकते हैं कि हमें एक अलग परिणाम मिलता है।

Previous code with exception handling
Enter number between 1 > 10: 'Hi'
Error..numbers only

अपवाद उठाना

अपने स्वयं के तरीकों से अपने अपवादों को बढ़ाने के लिए आपको इस तरह से कीवर्ड बढ़ाने की आवश्यकता है

raise ExceptionClass(‘Some Text Here’)

एक उदाहरण लेते हैं

def enterAge(age):
   if age<0:
      raise ValueError('Only positive integers are allowed')
   if age % 2 ==0:
      print('Entered Age is even')
   else:
      print('Entered Age is odd')

try:
   num = int(input('Enter your age: '))
   enterAge(num)
except ValueError:
   print('Only positive integers are allowed')

प्रोग्राम चलाएँ और सकारात्मक पूर्णांक दर्ज करें।

अपेक्षित उत्पादन

Enter your age: 12
Entered Age is even

लेकिन जब हम एक नकारात्मक संख्या दर्ज करने का प्रयास करते हैं, तो हम प्राप्त करते हैं,

अपेक्षित उत्पादन

Enter your age: -2
Only positive integers are allowed

कस्टम अपवाद वर्ग बनाना

आप BaseException वर्ग का विस्तार करके या BaseException के उपवर्ग द्वारा एक कस्टम अपवाद वर्ग बना सकते हैं।

ऊपर के आरेख से हम पायथन में अधिकांश अपवाद वर्गों को बेसएक्स अपवाद कक्षा से निकाल सकते हैं। आप अपना अपवाद वर्ग BaseException वर्ग या इसके उपवर्ग से प्राप्त कर सकते हैं।

एक नई फ़ाइल बनाएं जिसका नाम है NegativeNumberException.py और निम्न कोड लिखना।

class NegativeNumberException(RuntimeError):
   def __init__(self, age):
      super().__init__()
      self.age = age

उपरोक्त कोड एक नया अपवाद वर्ग बनाता है जिसका नाम है नेगेटिवनंबर अपवाद, जिसमें केवल कंस्ट्रक्टर होते हैं जो सुपर () __ init __ () का उपयोग करके पेरेंट क्लास कंस्ट्रक्टर को कॉल करते हैं और उम्र निर्धारित करते हैं।

अब अपना स्वयं का अपवाद अपवाद वर्ग बनाने के लिए, कुछ कोड लिखेंगे और नए अपवाद वर्ग को आयात करेंगे।

from NegativeNumberException import NegativeNumberException
def enterage(age):
   if age < 0:
      raise NegativeNumberException('Only positive integers are allowed')

   if age % 2 == 0:
      print('Age is Even')

   else:
      print('Age is Odd')

try:
   num = int(input('Enter your age: '))
   enterage(num)
except NegativeNumberException:
   print('Only positive integers are allowed')
except:
   print('Something is wrong')

उत्पादन

Enter your age: -2
Only positive integers are allowed

कस्टम एक्सेप्शन क्लास बनाने का दूसरा तरीका।

class customException(Exception):
   def __init__(self, value):
      self.parameter = value

   def __str__(self):
      return repr(self.parameter)
try:
   raise customException('My Useful Error Message!')
except customException as instance:
   print('Caught: ' + instance.parameter)

उत्पादन

Caught: My Useful Error Message!

अपवाद पदानुक्रम

निर्मित अपवादों के लिए श्रेणी पदानुक्रम है -

+-- SystemExit 
+-- KeyboardInterrupt 
+-- GeneratorExit 
+-- Exception 
+-- StopIteration 
+-- StopAsyncIteration 
+-- ArithmeticError 
| +-- FloatingPointError 
| +-- OverflowError 
| +-- ZeroDivisionError 
+-- AssertionError 
+-- AttributeError 
+-- BufferError 
+-- EOFError 
+-- ImportError 
+-- LookupError 
| +-- IndexError 
| +-- KeyError 
+-- MemoryError 
+-- NameError 
| +-- UnboundLocalError 
+-- OSError 
| +-- BlockingIOError 
| +-- ChildProcessError 
| +-- ConnectionError 
| | +-- BrokenPipeError 
| | +-- ConnectionAbortedError 
| | +-- ConnectionRefusedError 
| | +-- ConnectionResetError 
| +-- FileExistsError 
| +-- FileNotFoundError 
| +-- InterruptedError 
| +-- IsADirectoryError 
| +-- NotADirectoryError 
| +-- PermissionError 
| +-- ProcessLookupError 
| +-- TimeoutError 
+-- ReferenceError 
+-- RuntimeError 
| +-- NotImplementedError 
| +-- RecursionError 
+-- SyntaxError 
| +-- IndentationError
| +-- TabError 
+-- SystemError 
+-- TypeError 
+-- ValueError 
| +-- UnicodeError 
| +-- UnicodeDecodeError 
| +-- UnicodeEncodeError 
| +-- UnicodeTranslateError 
+-- Warning 
+-- DeprecationWarning 
+-- PendingDeprecationWarning 
+-- RuntimeWarning 
+-- SyntaxWarning 
+-- UserWarning 
+-- FutureWarning 
+-- ImportWarning 
+-- UnicodeWarning 
+-- BytesWarning 
+-- ResourceWarning