python try except python handling exception with examples
Ce tutoriel explique la gestion des exceptions en Python à l'aide du bloc Try Except à l'aide d'exemples de programmation:
Deux types d'erreur peuvent provoquer l'arrêt brusque d'un programme Python, c'est-à-dire Erreurs de syntaxe , et Exceptions . Dans ce didacticiel, nous aborderons le deuxième type d'erreur (exceptions) sous plusieurs rubriques importantes.
Nous bénéficierons beaucoup de la gestion des exceptions dans notre application telles que:
- Créer une application robuste.
- Créer un code propre et sans erreur.
=> Visitez ici pour la série exclusive de didacticiels de formation Python
VPN gratuit Allemagne
Ce que vous apprendrez:
- Essayez Python sauf
- Exceptions Python courantes
- Conclusion
Essayez Python sauf
Une bonne nouvelle est que Python a un bon nombre d'exceptions intégrées pour détecter les erreurs dans notre code. En outre, cela nous donne la possibilité de créer des exceptions personnalisées lorsqu'aucune des exceptions intégrées ne répond à nos besoins.
Qu'est-ce qu'une exception
Alors, qu'est-ce qu'une exception en Python? Eh bien, en termes simples, chaque fois que l’interpréteur Python tente d’exécuter du code non valide, il déclenche une exception, et dans les cas où une telle exception n’est pas gérée, il perturbe le flux normal des instructions du programme et imprime un retraçage.
Créons un code non valide et voyons comment l'interpréteur Python répondra.
Ouvrez un shell Python et exécutez le code suivant.
>>> 50/0
C'est l'une des erreurs de programmation les plus courantes. Le code ci-dessus essaie de diviser le nombre cinquante par 0 (zéro). L'interpréteur Python voit cela comme une opération non valide et déclenche un ZeroDivisionError , interrompt le programme et imprime une trace.
Nous pouvons voir clairement que ZeroDivisionError est l'exception qui a été soulevée. C’est en effet la manière propre de Python de nous dire que ce n’est pas cool de diviser un nombre par zéro. Bien que dans d'autres langages comme JavaScript, ce n'est pas une erreur; et python interdit strictement cette pratique.
De plus, il est important de savoir qu'il ne s'agit que d'un objet d'exception et que Python a de nombreux objets de ce type intégrés. Découvrez ce fonctionnaire Python Documentation pour voir toutes les exceptions intégrées Python.
Comprendre le traçage
Avant d'entrer dans la gestion des exceptions, je pense que cela vous aidera à comprendre ce qui se passera exactement si les exceptions ne sont pas gérées et comment Python fait de son mieux pour nous informer de notre erreur.
Chaque fois que Python rencontre une erreur, il déclenche une exception. Si cette exception n'est pas gérée, elle produit des informations appelées Traceback. Alors, quelles informations contient ce traçage?
Il contient:
- Le message d'erreur qui nous indique quelle exception a été déclenchée et ce qui s'est passé avant que cette exception ne soit déclenchée.
- Les différents numéros de ligne du code à l'origine de cette erreur. Une erreur peut être causée par une séquence d'appels de fonction appelée pile d'appels dont nous discuterons plus tard ici.
Bien que ce soit un peu déroutant, nous promettons que le prochain exemple apportera plus de lumière à notre compréhension.
Rappelez-vous le retraçage qui a été imprimé à partir de la division de 50 par 0 ci-dessus, nous pouvons voir que le retraçage contient les informations suivantes:
- Fichier «»: Cela nous indique que ce code a été exécuté à partir d'un terminal de console.
- ligne 1: Cela nous indique que l'erreur s'est produite dans ce numéro de ligne.
- ZeroDivisionError: division par zéro: Il nous indique quelle exception a été déclenchée et ce qui l'a provoquée.
Essayons un autre exemple et voyons peut-être comment un pile d'appels ressemble à. Ouvrez un éditeur, entrez le code ci-dessous et enregistrez-le sous tracebackExp .py
def stack1(numb): # 1 div = 0 # 2 stack2(numb, div) # 3 def stack2(numb, div): # 5 compute = numb/div # 6 print(compute) # 7 if __name__ == '__main__': # 9 numb = 5 # 10 stack1(numb) # 11
Ouvrez un terminal dans le répertoire où se trouve ce fichier et exécutez-le.
python tracebackExp.py
Vous verrez le suivi suivant:
Le traçage ci-dessus peut sembler déroutant, mais ce n’est vraiment pas le cas. Les pythonistes ont trouvé la meilleure façon de lire le traçage, qui provient du de bas en haut . Alors, utilisons cette sagesse pour essayer de comprendre ce que ce retraçage a à offrir.
- Tout en bas, nous obtenons l'exception qui a été soulevée et pourquoi elle a été soulevée.
- En remontant, nous obtenons le nom du fichier tracebackExp .py où cette erreur s'est produite, le calcul qui a causé cette erreur compute = numb / div, la fonction stack2 et la ligne de numéro de lien 6 où ce calcul a été effectué.
- En remontant, nous voyons que notre fonction stack2 a été appelée dans la fonction stack1 à la ligne numéro 3.
- En passant au sommet, nous voyons que la fonction stack1 a été appelée à la ligne numéro 11.< module > nous indique que c'est le fichier qui est en cours d'exécution.
Exceptions Python courantes
La bibliothèque Python définit un très grand nombre d'exceptions intégrées. Vous pouvez consulter la documentation Python ou appeler le local () fonction comme ci-dessous:
>>> dir(locals()('__builtins__'))
Nous n'essaierons pas de traiter toutes ces exceptions, mais nous verrons quelques exceptions courantes que vous rencontrerez probablement.
# 1) TypeError
Il est déclenché lorsqu'une opération ou une fonction est appliquée à un objet d'un type inapproprié.
Exemple 1
Considérez le programme ci-dessous. Il prend un dividende et un diviseur, puis calcule et imprime le résultat de la division du dividende par le diviseur.
def compute_division(): dividend = int(input('Enter the dividend: ')) # cast string to int divisor = input('Enter the divisor: ') # no casting # Compute division result = dividend/divisor # print result print('The result of {}/{} is: {}'.format(dividend, divisor, result)) if __name__ == '__main__': result = compute_division()
Nous demandons la valeur du dividende et du diviseur à l'utilisateur, mais nous oublions de convertir la valeur de chaîne du diviseur en un entier. Donc, nous nous retrouvons avec le type du dividende entier ( int ) et le type du diviseur étant une chaîne ( p ). Nous obtenons alors le Erreur-type car l'opérateur de division (/) ne fonctionne pas sur les chaînes.
Il peut vous intéresser de savoir que contrairement à Python, Javascript a une coercition de type qui convertit fondamentalement l'un des types de l'opérande en une valeur équivalente du type de l'autre opérande lorsque les opérandes sont de types différents.
# 2) ValueError
Ceci est déclenché lorsqu'une opération ou une fonction reçoit un argument qui a le bon type mais une valeur inappropriée.
Exemple 2
Considérez notre programme en Exemple 1 au dessus.
Si l'utilisateur entre une valeur alphanumérique pour le dividende comme «3a», alors notre programme lèvera l'exception ValueError. C'est parce que, bien que Python int () La méthode prend n'importe quel nombre ou chaîne et retourne un objet entier, la valeur de chaîne ne doit pas contenir de lettres ou de valeur non numérique.
# 3) AttributeError
Cette exception est déclenchée lors de l'attribution ou du référencement d'un attribut qui n'existe pas.
Exemple 3
Considérez le programme ci-dessous. Il prend un nombre et calcule sa racine carrée en utilisant le Module mathématique Python
import math # import math library to gain access to its code def compute_square_root(number): # compute the square root using the math library result = math.sqr(number) return result if __name__ == '__main__': # get input to compute from user number = int(input('Compute Square root of: ')) # call function to compute square root
Lorsqu'un utilisateur entre un nombre, notre programme essaie d'utiliser une fonction du module mathématique pour calculer sa racine carrée mais juste qu'ici, nous avons fait une erreur. Au lieu de sqrt, nous avons tapé par erreur sqr qui n’existe pas dans le module mathématique.
Nous avons donc essayé de référencer un attribut sqr qui n’existe pas et a conduit à la levée de l’exception AttributeError. La plupart d'entre nous commettons souvent ce genre d'erreur. Donc, vous n'êtes pas seul.
Gestion des exceptions avec Try Except
En tant que programmeur, une chose sur laquelle la plupart d'entre nous passerons notre temps est l'écriture d'un code robuste et résilient. Code qui ne casse pas en raison d'erreurs. En Python, nous pouvons y parvenir en insérant nos déclarations dans un essayer - sauf déclaration.
Instruction Try-Except Python
L'instruction try-except a la structure suivante:
try: #your code goes here except '''Specify exception type(s) here''': #handle exception here
Insérons le code dans tracebackExp .py dans une instruction try-except.
def stack1(numb): # 1 div = 0 # 2 stack2(numb, div) # 3 def stack2(numb, div): # 5 try: # 6 compute = numb/div # 7 print(compute) # 8 except ZeroDivisionError as zde: # 9 print(zde) # 10 if __name__ == '__main__': # 12 numb = 5 # 13 stack1(numb) # 14 print('program continuous') # 15
L'exécution de ce code produira la sortie
Voici comment fonctionne l'instruction try-except. Python exécute le code dans le bloc try ligne 7-8 . Si aucun code invalide n'est trouvé, alors le code dans le bloc except ligne 10 est ignoré et l'exécution se poursuit.
Mais, si un code invalide est trouvé, l'exécution s'arrête immédiatement dans le bloc try et vérifie si l'exception déclenchée correspond à celle que nous avons fournie dans l'instruction except ligne 9 . S'il correspond, alors le bloc except est exécuté et continue. Si ce n’est pas le cas, le programme s’interrompra.
Le bloc try contient généralement le code qui peut déclencher une exception tandis que le bloc except attrape et gère l'exception.
Gestion de plusieurs exceptions avec sauf
Nous pouvons gérer plusieurs exceptions avec un seul «sauf» ou plusieurs «exceptions». Tout dépend de la manière dont vous souhaitez gérer chaque exception.
# 1) Gérer plusieurs exceptions avec une seule exception
try: #your code goes here except(Exception1(, Exception2(,...ExceptionN)))): #handle exception here
Cette méthode est utilisée lorsque nous soupçonnons que notre code peut déclencher différentes exceptions et que nous voulons effectuer la même action dans chaque cas. Donc, si l'interpréteur Python trouve une correspondance, alors le code écrit dans le bloc except s'exécutera.
Prenons l'exemple de code Python ci-dessous
def get_fraction(value, idx): arr = (4,5,2,0) # a list of numbers idx_value = arr(idx) # if idx is > arr length, IndexError will be raised value/idx_value # if idx_value == 0, ZeroDivisionError will be raised if __name__ =='__main__': # set 'value' and 'idx' value = 54 idx = 3 # call function in a try-except statement. try: result = get_fraction(value, idx) print('Fraction is ', result) except (IndexError, ZeroDivisionError) as ex: print(ex)
Nous avons deux exceptions possibles qui pourraient être soulevées ici, ZeroDivisionError et IndexError . Si l'une de ces exceptions est déclenchée, le bloc except sera exécuté.
Dans le code ci-dessus, idx = 3, donc idx_ valeur devient 0 et valeur / idx_ valeur lèvera ZeroDivisionError
# 2) Gérer plusieurs exceptions avec plusieurs exceptions
try: #your code goes here except Exception1: #handle exception1 here except Exception2: #handle exception2 here except ExceptionN: #handle exceptionN here
Si nous préférons traiter chaque exception séparément, voici comment vous pouvez le faire.
Considérez l'exemple de code Python ci-dessous
def get_fraction(value, idx): arr = (4,5,2,0) # a list of numbers idx_value = arr(idx) # if idx is > arr length, IndexError will be raised value/idx_value # if idx_value == 0, ZeroDivisionError will be raised if __name__ =='__main__': # set 'value' and 'idx' value = 54 idx = 5 # call function in a try-excepts statement. try: result = get_fraction(value, idx) print('Fraction is ', result) except IndexError: print('idx of {} is out of range'.format(idx)) except ZeroDivisionError: print('arr({}) is 0. Hence, can't divide by zero'.format(idx)) except Exception as ex: print(ex) print('Not sure what happened so not safe to continue, app will be interrupted') raise ex
Nous remarquons ici que Exception a été utilisé dans la dernière instruction except. En effet, l'objet d'exception Exception correspond à n'importe quelle exception. Pour cette raison, il devrait toujours être le dernier, car Python cessera de vérifier les autres gestionnaires d'exceptions une fois que l'un d'eux correspond.
Dans le code ci-dessus, idx = 5 , Par conséquent arr (idx) augmentera IndexError car idx est supérieur à la longueur de la liste arr
En outre, ne pas savoir quelle exception a été déclenchée par votre application n'est jamais sûr de continuer l'exécution. C’est pourquoi nous avons le type Exception pour détecter toutes les exceptions imprévues. Ensuite, nous informons l'utilisateur et interrompons l'application en levant la même exception.
Instruction Try Else
C'est un fonction optionnelle de gestion des exceptions et vous permet d'ajouter du code que vous souhaitez exécuter lorsqu'aucune erreur ne s'est produite. Si une erreur se produit, ce bloc else ne s'exécutera pas.
Considérez l'exemple de code Python ci-dessous, ouvrez votre éditeur et enregistrez le code sous elseTry.py
def fraction_of_one(divisor): value = 1/divisor # if divisor is zero, ZeroDivisionError will be raised return value if __name__ == '__main__': while True: try: # Get input from the user. # if input is not a valid argument for int(), ValueError will be raised divisor = int(input('Enter a divisor: ')) # call our function to compute the fraction value = fraction_of_one(divisor) except (ValueError, ZeroDivisionError): print('Input can't be zero and should be a valid literal for int(). Please, try again!') else: print('Value: ', value) break
Nous obtenons une entrée de l'utilisateur et l'utilisons pour diviser 1. Nous avons deux exceptions possibles ici, une entrée utilisateur invalide qui entraînera ValueError et un zéro (0) ce qui causera ZeroDivisionError . Notre déclaration except gère ces erreurs.
Maintenant, nous voulons imprimer la valeur de valeur . Notre bloc else s'assure qu'il n'est imprimé que si notre bloc try s'exécute sans erreur. Ceci est important car si une erreur se produit dans notre bloc try, le valeur sera indéfini. Donc, y accéder provoquera une autre erreur.
Exécutez le code ci-dessus avec Python elseTry.py
La sortie ci-dessus montre que pour la première entrée, nous avons tapé 0 et appuyez sur ENTER. Puisque notre diviseur a reçu 0, 1 / diviseur augmenté zeroDivisionError . Notre deuxième entrée était k, ce qui n'est pas valide pour int (), d'où l'exception ValueError est soulevé.
Mais notre dernière entrée était 9, ce qui est valide et, par conséquent, nous avons obtenu la valeur ' valeur 'Imprimé sous le numéro 0.1111111111111111
Instruction Try Enfin
C'est aussi un fonction optionnelle de gestion des exceptions et fonctionnera toujours quoi qu'il arrive dans les gestionnaires d'exceptions.
C'est-à-dire:
- Qu'une exception se produise ou non
- Même si un «retour» est appelé dans les autres blocs.
- Même si le script est fermé dans les autres blocs
Donc, si nous avons un code que nous voulons exécuter dans toutes les situations, le bloc final est notre gars. Ce bloc est principalement utilisé pour les nettoyages comme la fermeture de fichiers.
Considérez l'exemple de code Python ci-dessous
def readFile(file_path): try: openFile = open(file_path,'r') # Open a file as read-only print(openFile.readline()) # Read first line of file content except FileNotFoundError as ex: print(ex) finally: print('Cleaning...') openFile.close() if __name__ == '__main__': filePath = './text.txt' readFile(filePath)
Ce code tente d'ouvrir et de lire le fichier text.txt dans son répertoire actuel. Si le fichier existe, notre programme imprimera la première ligne du fichier, puis notre bloc finally s'exécutera et fermera le fichier.
Disons que nous avons un fichier appelé text.txt dans le répertoire où se trouve ce fichier programme et contient Hello. Si nous exécutons le programme, nous aurons la sortie
Cet exemple a été choisi intentionnellement parce que je voulais que nous abordions un petit problème qui peut survenir lors de la fermeture de fichiers dans le bloc finally.
Si le fichier n’existe pas, l’exception FileNotFoundError sera augmentée et la variable fichier ouvert ne sera pas défini et ne sera pas un objet fichier. Par conséquent, essayer de le fermer dans le bloc finally lèvera une exception UnboundLocalError qui est une sous-classe de NameError .
Cela dit essentiellement que nous essayons de référencer la variable fichier ouvert avant qu'il ne soit attribué.
Une petite astuce ici est d'utiliser des gestionnaires d'exceptions dans le bloc finally.
def readFile(file_path): try: openFile = open(file_path,'r') # Open a file as read-only print(openFile.readline()) # Read first line of file content except FileNotFoundError as ex: print(ex) finally: try: print('Cleaning...') openFile.close() except: # catches all exceptions pass # Ignore this error because we don't care. if __name__ == '__main__': filePath = './text.txt' readFile(filePath)
Si notre bloc try déclenche FileNotFoundError, nous aurons la sortie suivante
Lever une exception
Une bonne nouvelle concernant les exceptions Python est que nous pouvons les lever intentionnellement. Des exceptions sont soulevées avec le augmenter la déclaration .
L'instruction rise a la syntaxe suivante:
raise (ExceptionName((*args: Object)))
Ouvrez un terminal et déclenchez tout objet d'exception depuis le Exceptions intégrées Python. Par exemple, si nous lançons ZeroDivisionError:
>>> raise ZeroDivisionError('Can't divide by zero')
Nous obtiendrons le retraçage:
Alors, pourquoi est-il important de soulever des exceptions?
- Lorsque vous travaillez avec des exceptions personnalisées.
- Pendant les contrôles de santé.
Classes d'exception personnalisées
Une exception personnalisée est une exception que vous créez pour gérer les erreurs spécifiques à vos besoins. L'astuce est, nous définissons une classe qui dérive de l'objet Exception , puis nous utilisons l'instruction rise pour élever notre classe d'exception.
Supposons que nous voulions vérifier l'entrée utilisateur et nous assurer que la valeur d'entrée n'est pas négative (contrôle de cohérence). Bien sûr, nous pourrions lever l'exception Python ValueError mais nous aimerons personnaliser l'erreur en lui donnant un nom spécifique et explicite comme InputIsNegativeError . Mais cette exception n'est pas une exception Python intégrée.
Donc d'abord, nous créons notre classe de base qui dérivera d'Exception.
class CustomError(Exception): 'Base class exception for all exceptions of this module' pass
Ensuite, nous créons notre classe d'exception qui héritera de la classe de base et gérera notre erreur spécifique.
class InputIsNegativeError(CustomError): '''Raised when User enters a negative value''' pass
Testons ceci
try: value = int(input()) if value <0: raise InputIsNegativeError # Raise exception if value is negative except InputIsNegativeError: # catch and handle exception print('Input value shouldn't be negative')
La demande de code ci-dessus pour l'entrée de l'utilisateur et vérifiez si elle est négative. Si vrai, cela déclenche notre exception personnalisée InputIsNegativeError qui est plus tard interceptée dans l'instruction except.
Voici le code complet:
class CustomError(Exception): 'Base class exception for all exceptions of this module' pass class InputIsNegativeError(CustomError): '''Raised when User enters a negative value''' pass if __name__ == '__main__': try: value = int(input('Input a number: ')) if value <0: raise InputIsNegativeError # Raise exception if value is negative except InputIsNegativeError: # catch and handle exception print('Input value shouldn't be negative')
Si la valeur d'entrée est un nombre négatif comme -1, alors nous aurons la sortie:
Vérifiez Doc Python pour plus de détails sur les exceptions personnalisées Python.
Questions fréquemment posées
Q # 1) Comment Python gère-t-il une exception?
Répondre: Python gère les exceptions à l'aide du instruction try-except . Le code qui peut déclencher une exception est placé et exécuté dans le essayer de bloquer tandis que le sauf bloc contient le code qui gérera les exceptions le cas échéant.
Q # 2) Qu'est-ce que lever une exception en Python?
Répondre: Chaque fois que l'interpréteur Python rencontre un code non valide, il déclenche une exception, ce qui est la manière propre de Python de nous dire que quelque chose d'inattendu s'est produit. Nous pouvons également déclencher intentionnellement des exceptions en utilisant le augmenter la déclaration .
Q # 3) Comment Python gère-t-il plusieurs exceptions?
Répondre: Python gère plusieurs exceptions en utilisant un seul bloc sauf ou plusieurs blocs sauf.
Pour un seul bloc, les exceptions sont passées sous forme de tuple: sauf (Exception1, Exception2, .., ExceptionN) et Python vérifie une correspondance de droite à gauche. Dans ce cas, la même action est effectuée pour chaque exception.
Une autre façon d'attraper toutes les exceptions consiste à omettre le nom de l'exception après le mot-clé except.
except: # handle all exceptions here
La deuxième méthode consiste à utiliser un bloc except pour chaque exception:
except Exception1: # code to handle Exception1 goes here except Exception2: # code to handle Exception2 goes here except ExceptionN: # code to handle ExceptionN goes here
De cette façon, vous pouvez effectuer des actions distinctes pour chaque exception.
Q # 4) Pourquoi la gestion des exceptions est-elle importante en Python?
Répondre: L'avantage de la gestion des exceptions en Python est que nous pouvons créer des applications robustes, propres et sans erreur. Nous ne voulons pas que notre code de production se bloque en raison d'erreurs. Nous gérons donc les erreurs et maintenons notre application opérationnelle.
Q # 5) Comment ignorer une exception en Python?
Répondre: Pour ignorer une exception en Python, utilisez le passe mot-clé dans le bloc except. Disons que nous voulons ignorer l'exception ValueError. Nous allons le faire de cette façon:
except ValueError: pass
À moins que vous ne sachiez ce que vous faites, ignorer les exceptions est une mauvaise pratique. Au moins, informez l'utilisateur de toutes les erreurs potentielles.
Conclusion
Dans ce didacticiel, nous avons couvert: Exceptions Python, Traceback; comment gérer les exceptions avec Essayer / Sauf / Autre / Pour terminer blocs, comment Augmenter Exceptions, et enfin comment créer nos propres exceptions personnalisées.
Merci d'avoir lu!
=> Visitez ici pour apprendre Python à partir de zéro.
lecture recommandée
- Tutoriel Python pour les débutants (formation pratique gratuite sur Python)
- Instructions de contrôle Python (Python Continue, Break et Pass)
- Tutoriel Python DateTime avec des exemples
- Fonctions de chaîne Python
- Variables Python
- Tutoriel sur la gestion des exceptions C # avec des exemples de code
- Guide complet de la gestion des exceptions PL SQL avec des exemples
- Exceptions Java et gestion des exceptions avec des exemples