Exceptions Python: une introduction

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.

An introduction to exceptions in Python

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.

Illustration of raise statement usage

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.

Python assert statement

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.

Diagram showing try and except statements

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:

ExceptionFileNotFoundError

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 clausetry est exécutée jusqu'au point où la première exception est rencontrée.

  • Dans la clauseexcept, 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.

  • Évitez d'utiliser des clausesexcept nues.

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.

Diagram of try

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.

Diagram explaining try except else finally statements

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 clausetry, 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.