Exceptions Python: une introduction
Un programme Python se termine dès qu'il rencontre une erreur. En Python, une erreur peut être une erreur de syntaxe ou une exception. Dans cet article, vous verrez ce qu'est une exception et comment elle diffère d'une erreur de syntaxe. Après cela, vous apprendrez à lever des exceptions et à faire des assertions. Ensuite, vous terminerez avec une démonstration du bloc try and except.
Téléchargement PDF gratuit: Aide-mémoire Python 3
Exceptions et erreurs de syntaxe
Des erreurs de syntaxe se produisent lorsque l'analyseur détecte une instruction incorrecte. Observez l'exemple suivant:
>>> print( 0 / 0 ))
File "", line 1
print( 0 / 0 ))
^
SyntaxError: invalid syntax
La flèche indique où l'analyseur a rencontré lessyntax error. Dans cet exemple, il y avait un support de trop. Supprimez-le et exécutez à nouveau votre code:
>>> print( 0 / 0)
Traceback (most recent call last):
File "", line 1, in
ZeroDivisionError: integer division or modulo by zero
Cette fois, vous êtes tombé sur unexception error. Ce type d'erreur se produit chaque fois que du code Python correct syntaxiquement entraîne une erreur. La dernière ligne du message indique le type d'erreur d'exception que vous avez rencontré.
Au lieu d'afficher le messageexception error
, Python détaille le type d'erreur d'exception rencontré. Dans ce cas, c'était unZeroDivisionError
. Python est livré avecvarious built-in exceptions ainsi que la possibilité de créer des exceptions auto-définies.
Levée d'une exception
Nous pouvons utiliserraise
pour lever une exception si une condition se produit. L'instruction peut être complétée par une exception personnalisée.
Si vous voulez lancer une erreur lorsqu'une certaine condition se produit en utilisantraise
, vous pouvez procéder comme ceci:
x = 10
if x > 5:
raise Exception('x should not exceed 5. The value of x was: {}'.format(x))
Lorsque vous exécutez ce code, la sortie sera la suivante:
Traceback (most recent call last):
File "", line 4, in
Exception: x should not exceed 5. The value of x was: 10
Le programme s'arrête et affiche notre exception à l'écran, offrant des indices sur ce qui n'a pas fonctionné.
L'exceptionAssertionError
Au lieu d'attendre qu'un programme plante à mi-chemin, vous pouvez également démarrer parmaking an assertion in Python. Nousassert
qu'une certaine condition est remplie. Si cette condition s'avère êtreTrue
, alors c'est excellent! Le programme peut continuer. Si la condition s'avère êtreFalse
, vous pouvez demander au programme de lancer une exceptionAssertionError
.
Jetez un œil à l'exemple suivant, où il est affirmé que le code sera exécuté sur un système Linux:
import sys
assert ('linux' in sys.platform), "This code runs on Linux only."
Si vous exécutez ce code sur une machine Linux, l'assertion passe. Si vous exécutiez ce code sur une machine Windows, le résultat de l'assertion seraitFalse
et le résultat serait le suivant:
Traceback (most recent call last):
File "", line 2, in
AssertionError: This code runs on Linux only.
Dans cet exemple, lancer une exceptionAssertionError
est la dernière chose que le programme fera. Le programme s'arrêtera et ne se poursuivra pas. Et si ce n'est pas ce que tu veux?
Le bloctry
etexcept
: gestion des exceptions
Le bloctry
etexcept
en Python est utilisé pour intercepter et gérer les exceptions. Python exécute le code suivant l'instructiontry
comme une partie «normale» du programme. Le code qui suit l'instructionexcept
est la réponse du programme à toutes les exceptions de la clausetry
précédente.
Comme vous l'avez vu précédemment, lorsque du code syntaxiquement correct rencontre une erreur, Python lève une erreur d'exception. Cette erreur d'exception plantera le programme s'il n'est pas géré. La clauseexcept
détermine la manière dont votre programme répond aux exceptions.
La fonction suivante peut vous aider à comprendre le bloctry
etexcept
:
def linux_interaction():
assert ('linux' in sys.platform), "Function can only run on Linux systems."
print('Doing something.')
Leslinux_interaction()
ne peuvent fonctionner que sur un système Linux. Lesassert
de cette fonction lèveront une exceptionAssertionError
si vous l'appelez sur un système d'exploitation autre que Linux.
Vous pouvez donner à la fonction untry
en utilisant le code suivant:
try:
linux_interaction()
except:
pass
La façon dont vous avez géré l'erreur ici est de distribuer unpass
. Si vous deviez exécuter ce code sur une machine Windows, vous obtiendriez la sortie suivante:
Tu n'as rien. La bonne chose ici est que le programme n'a pas planté. Mais ce serait bien de voir si un type d'exception s'est produit chaque fois que vous avez exécuté votre code. À cette fin, vous pouvez changer lespass
en quelque chose qui générerait un message informatif, comme ceci:
try:
linux_interaction()
except:
print('Linux function was not executed')
Exécutez ce code sur une machine Windows:
Linux function was not executed
Lorsqu'une exception se produit dans un programme exécutant cette fonction, le programme continuera et vous informera du fait que l'appel de fonction n'a pas réussi.
Ce que vous n'avez pas pu voir, c'est le type d'erreur qui a été généré à la suite de l'appel de fonction. Afin de voir exactement ce qui a mal tourné, vous devez détecter l'erreur que la fonction a lancée.
Le code suivant est un exemple dans lequel vous capturez lesAssertionError
et affichez ce message à l'écran:
try:
linux_interaction()
except AssertionError as error:
print(error)
print('The linux_interaction() function was not executed')
L'exécution de cette fonction sur une machine Windows génère les éléments suivants:
Function can only run on Linux systems.
The linux_interaction() function was not executed
Le premier message est leAssertionError
, vous informant que la fonction ne peut être exécutée que sur une machine Linux. Le deuxième message vous indique quelle fonction n'a pas été exécutée.
Dans l'exemple précédent, vous avez appelé une fonction que vous avez écrite vous-même. Lorsque vous avez exécuté la fonction, vous avez détecté l'exceptionAssertionError
et l'avez imprimée à l'écran.
Voici un autre exemple où vous ouvrez un fichier et utilisez une exception intégrée:
try:
with open('file.log') as file:
read_data = file.read()
except:
print('Could not open file.log')
Sifile.log n'existe pas, ce bloc de code produira ce qui suit:
Could not open file.log
Il s'agit d'un message informatif et notre programme continuera de fonctionner. Dans lesPython docs, vous pouvez voir qu'il y a beaucoup d'exceptions intégrées que vous pouvez utiliser ici. Une exception décrite sur cette page est la suivante:
Exception
FileNotFoundError
Déclenché lorsqu'un fichier ou un répertoire est demandé mais n'existe pas. Correspond à errno ENOENT.
Pour intercepter ce type d'exception et l'imprimer à l'écran, vous pouvez utiliser le code suivant:
try:
with open('file.log') as file:
read_data = file.read()
except FileNotFoundError as fnf_error:
print(fnf_error)
Dans ce cas, sifile.log n'existe pas, la sortie sera la suivante:
[Errno 2] No such file or directory: 'file.log'
Vous pouvez avoir plus d'un appel de fonction dans votre clausetry
et anticiper intercepter diverses exceptions. Une chose à noter ici est que le code de la clausetry
s'arrêtera dès qu'une exception sera rencontrée.
Warning: La capture deException
masque toutes les erreurs… même celles qui sont complètement inattendues. C'est pourquoi vous devez éviter les clausesexcept
nues dans vos programmes Python. Au lieu de cela, vous voudrez vous référer auxspecific exception classes que vous voulez attraper et gérer. Vous pouvez en savoir plus sur les raisons pour lesquelles c'est une bonne idéein this tutorial.
Regardez le code suivant. Ici, vous appelez d'abord la fonctionlinux_interaction()
, puis essayez d'ouvrir un fichier:
try:
linux_interaction()
with open('file.log') as file:
read_data = file.read()
except FileNotFoundError as fnf_error:
print(fnf_error)
except AssertionError as error:
print(error)
print('Linux linux_interaction() function was not executed')
Si le fichier n'existe pas, l'exécution de ce code sur une machine Windows produira ce qui suit:
Function can only run on Linux systems.
Linux linux_interaction() function was not executed
Dans la clausetry
, vous avez immédiatement rencontré une exception et vous n'êtes pas arrivé à la partie où vous essayez d'ouvrirfile.log. Regardez maintenant ce qui se passe lorsque vous exécutez le code sur une machine Linux:
[Errno 2] No such file or directory: 'file.log'
Voici les points clés à retenir:
-
Une clause
try
est exécutée jusqu'au point où la première exception est rencontrée. -
Dans la clause
except
, ou dans le gestionnaire d'exceptions, vous déterminez la manière dont le programme répond à l'exception. -
Vous pouvez anticiper plusieurs exceptions et différencier la façon dont le programme doit y répondre.
La clauseelse
En Python, en utilisant l'instructionelse
, vous pouvez demander à un programme d'exécuter un certain bloc de code uniquement en l'absence d'exceptions.
Regardez l'exemple suivant:
try:
linux_interaction()
except AssertionError as error:
print(error)
else:
print('Executing the else clause.')
Si vous deviez exécuter ce code sur un système Linux, la sortie serait la suivante:
Doing something.
Executing the else clause.
Comme le programme n'a rencontré aucune exception, la clauseelse
a été exécutée.
Vous pouvez égalementtry
pour exécuter du code à l'intérieur de la clauseelse
et y détecter d'éventuelles exceptions:
try:
linux_interaction()
except AssertionError as error:
print(error)
else:
try:
with open('file.log') as file:
read_data = file.read()
except FileNotFoundError as fnf_error:
print(fnf_error)
Si vous deviez exécuter ce code sur une machine Linux, vous obtiendriez le résultat suivant:
Doing something.
[Errno 2] No such file or directory: 'file.log'
À partir de la sortie, vous pouvez voir que la fonctionlinux_interaction()
s'est exécutée. Comme aucune exception n'a été rencontrée, une tentative d'ouverture defile.log a été effectuée. Ce fichier n’existait pas et au lieu d’ouvrir le fichier, vous avez intercepté l’exceptionFileNotFoundError
.
Nettoyage après utilisation definally
Imaginez que vous deviez toujours implémenter une sorte d'action pour nettoyer après avoir exécuté votre code. Python vous permet de le faire en utilisant la clausefinally
.
Jetez un œil à l'exemple suivant:
try:
linux_interaction()
except AssertionError as error:
print(error)
else:
try:
with open('file.log') as file:
read_data = file.read()
except FileNotFoundError as fnf_error:
print(fnf_error)
finally:
print('Cleaning up, irrespective of any exceptions.')
Dans le code précédent, tout ce qui se trouve dans la clausefinally
sera exécuté. Peu importe si vous rencontrez une exception quelque part dans les clausestry
ouelse
. L'exécution du code précédent sur une machine Windows produirait les éléments suivants:
Function can only run on Linux systems.
Cleaning up, irrespective of any exceptions.
Résumer
Après avoir vu la différence entre les erreurs de syntaxe et les exceptions, vous avez découvert différentes manières de déclencher, d'intercepter et de gérer des exceptions en Python. Dans cet article, vous avez vu les options suivantes:
-
raise
vous permet de lever une exception à tout moment. -
assert
vous permet de vérifier si une certaine condition est remplie et de lever une exception si ce n'est pas le cas. -
Dans la clause
try
, toutes les instructions sont exécutées jusqu'à ce qu'une exception soit rencontrée. -
except
est utilisé pour intercepter et gérer les exceptions rencontrées dans la clause try. -
else
vous permet de coder des sections qui ne doivent s'exécuter que lorsqu'aucune exception n'est rencontrée dans la clause try. -
finally
vous permet d'exécuter des sections de code qui doivent toujours s'exécuter, avec ou sans les exceptions rencontrées précédemment.
Téléchargement PDF gratuit: Aide-mémoire Python 3
J'espère que cet article vous a aidé à comprendre les outils de base que Python peut offrir lors du traitement des exceptions.