Classes d'exception et d'exception

En général, une exception est toute condition inhabituelle. Les exceptions indiquent généralement des erreurs, mais parfois elles mettent intentionnellement dans le programme, dans des cas comme la fin prématurée d'une procédure ou la récupération d'une pénurie de ressources. Il existe un certain nombre d'exceptions intégrées, qui indiquent des conditions telles que la lecture au-delà de la fin d'un fichier ou la division par zéro. Nous pouvons définir nos propres exceptions appelées exception personnalisée.

La gestion des exceptions vous permet de gérer les erreurs avec élégance et de faire quelque chose de significatif à ce sujet. La gestion des exceptions comporte deux éléments: «lancer» et «attraper».

Identification de l'exception (erreurs)

Chaque erreur se produit dans Python entraîne une exception qui entraînera une condition d'erreur identifiée par son type d'erreur.

>>> #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.

Exception de capture / piégeage

Quand quelque chose d'inhabituel se produit dans votre programme et que vous souhaitez le gérer en utilisant le mécanisme d'exception, vous «lancez une exception». Les mots-clés try and except sont utilisés pour intercepter les exceptions. Chaque fois qu'une erreur se produit dans un bloc try, Python recherche un bloc except correspondant pour le gérer. S'il y en a un, l'exécution y saute.

syntaxe

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

Le code dans la clause try sera exécuté instruction par instruction.

Si une exception se produit, le reste du bloc try sera ignoré et la clause except sera exécutée.

try:
   some statement here
except:
   exception handling

Écrivons du code pour voir ce qui se passe lorsque vous n'utilisez aucun mécanisme de gestion des erreurs dans votre programme.

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

Le programme ci-dessus fonctionnera correctement tant que l'utilisateur entre un nombre, mais que se passe-t-il si les utilisateurs essaient de mettre un autre type de données (comme une chaîne ou une liste).

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'"

Maintenant ValueError est un type d'exception. Essayons de réécrire le code ci-dessus avec la gestion des exceptions.

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)

Si nous exécutons le programme et entrons une chaîne (au lieu d'un nombre), nous pouvons voir que nous obtenons un résultat différent.

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

Lever des exceptions

Pour augmenter vos exceptions à partir de vos propres méthodes, vous devez utiliser un mot clé de montée comme celui-ci

raise ExceptionClass(‘Some Text Here’)

Prenons un exemple

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')

Exécutez le programme et entrez un entier positif.

Production attendue

Enter your age: 12
Entered Age is even

Mais lorsque nous essayons d'entrer un nombre négatif, nous obtenons,

Production attendue

Enter your age: -2
Only positive integers are allowed

Création d'une classe d'exception personnalisée

Vous pouvez créer une classe d'exception personnalisée en étendant la classe ou la sous-classe BaseException de BaseException.

À partir du diagramme ci-dessus, nous pouvons voir la plupart des classes d'exception en Python étendues à partir de la classe BaseException. Vous pouvez dériver votre propre classe d'exception à partir de la classe BaseException ou de sa sous-classe.

Créez un nouveau fichier appelé NegativeNumberException.py et écrivez le code suivant.

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

Le code ci-dessus crée une nouvelle classe d'exception nommée NegativeNumberException, qui consiste uniquement en un constructeur qui appelle le constructeur de classe parent à l'aide de super () __ init __ () et définit l'âge.

Maintenant, pour créer votre propre classe d'exception personnalisée, vous allez écrire du code et importer la nouvelle classe d'exception.

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')

Production

Enter your age: -2
Only positive integers are allowed

Une autre façon de créer une classe Exception personnalisée.

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)

Production

Caught: My Useful Error Message!

Hiérarchie des exceptions

La hiérarchie de classes pour les exceptions intégrées est -

+-- 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