Gérer les Exceptions avec try except en Python

PythonBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous apprendrez à gérer efficacement les exceptions en Python à l'aide de l'instruction try...except. Nous explorerons comment intercepter des exceptions spécifiques comme ValueError, gérer plusieurs types d'exceptions, et utiliser les blocs else et finally pour un meilleur contrôle du flux de votre programme. Vous apprendrez également à lever (raise) des exceptions personnalisées pour signaler des conditions d'erreur spécifiques dans votre code. Grâce à des exercices pratiques, vous acquerrez une expérience concrète dans l'écriture de programmes Python robustes et tolérants aux erreurs.

Ceci est un Guided Lab, qui fournit des instructions étape par étape pour vous aider à apprendre et à pratiquer. Suivez attentivement les instructions pour compléter chaque étape et acquérir une expérience pratique. Les données historiques montrent que c'est un laboratoire de niveau débutant avec un taux de réussite de 100%. Il a reçu un taux d'avis positifs de 100% de la part des apprenants.

Gérer ValueError avec try except

Dans cette étape, vous apprendrez à gérer une ValueError à l'aide de l'instruction try...except. Une ValueError se produit lorsqu'une fonction reçoit un argument du type correct mais avec une valeur inappropriée. Un exemple courant est d'essayer de convertir une chaîne de caractères qui n'est pas un nombre en entier à l'aide de la fonction int().

Nous allons écrire un script Python qui invite l'utilisateur à saisir un entier. Si la saisie n'est pas un entier valide, nous intercepterons la ValueError et afficherons un message convivial.

Dans l'explorateur de fichiers du WebIDE à gauche, trouvez et ouvrez le fichier handle_value_error.py situé dans le répertoire ~/project. Ensuite, ajoutez-y le code suivant :

while True:
    try:
        x = int(input('Please enter an integer: '))
        print(f'You entered: {x}')
        break
    except ValueError:
        print('That was not a valid integer. Please try again.')

Enregistrez le fichier.

Maintenant, ouvrez le terminal intégré et exécutez le script en utilisant la commande python :

python ~/project/handle_value_error.py

Le script vous demandera de saisir un entier. Essayez d'abord de saisir une valeur non entière comme hello pour voir la gestion des erreurs en action. Ensuite, saisissez un entier valide comme 123 pour voir le chemin d'exécution réussi.

Exemple de sortie :

Please enter an integer: hello
That was not a valid integer. Please try again.
Please enter an integer: 123
You entered: 123

Dans ce code :

  • La boucle while True: garantit que le programme continue de demander une saisie jusqu'à ce qu'un entier valide soit entré.
  • Le bloc try contient le code susceptible de lever une exception, spécifiquement l'appel int(input(...)).
  • Si une ValueError se produit dans le bloc try, le code à l'intérieur du bloc except ValueError: est exécuté.
  • Si aucune exception ne se produit, l'instruction print() s'exécute, et break sort de la boucle.

Ceci démontre comment try...except ValueError vous permet de gérer gracieusement les entrées invalides sans faire planter le programme.

Gérer les Exceptions Multiples

Write and Debug a Simple Python Program## Gérer les Exceptions Multiples

Un bloc de code peut potentiellement lever différents types d'exceptions. Python vous permet de gérer plusieurs exceptions en utilisant plusieurs clauses except ou en regroupant les exceptions dans une seule clause except.

Écrivons un script qui effectue une division. Cette opération peut lever une ValueError si la saisie n'est pas un nombre et une ZeroDivisionError si le diviseur est zéro.

Dans le WebIDE, ouvrez le fichier ~/project/handle_multiple_exceptions.py et ajoutez-y le code suivant. Cette version utilise des blocs except séparés pour chaque type d'erreur.

try:
    numerator = int(input("Enter the numerator: "))
    denominator = int(input("Enter the denominator: "))
    result = numerator / denominator
    print(f"Result: {result}")
except ValueError:
    print("Invalid input. Please enter integers only.")
except ZeroDivisionError:
    print("Error: Division by zero is not allowed.")

Enregistrez le fichier et exécutez-le depuis le terminal :

python ~/project/handle_multiple_exceptions.py

Testez le script avec différentes entrées pour déclencher chaque exception :

  1. Saisissez une valeur non entière (par exemple, abc).
  2. Saisissez 0 pour le dénominateur.
  3. Saisissez des entiers valides pour les deux.

Exemple de sortie pour la division par zéro :

Enter the numerator: 10
Enter the denominator: 0
Error: Division by zero is not allowed.

Vous pouvez également gérer plusieurs exceptions avec une seule clause except en les regroupant dans un tuple. Ceci est utile pour effectuer la même action pour différentes erreurs.

Maintenant, mettez à jour le code dans ~/project/handle_multiple_exceptions.py pour utiliser cette approche groupée :

try:
    numerator = int(input("Enter the numerator: "))
    denominator = int(input("Enter the denominator: "))
    result = numerator / denominator
    print(f"Result: {result}")
except (ValueError, ZeroDivisionError):
    print("An error occurred: Invalid input or division by zero.")

Enregistrez le fichier et exécutez-le à nouveau avec les mêmes cas de test pour observer le nouveau message d'erreur combiné.

Exécuter du Code avec la Clause else

L'instruction try peut inclure une clause else optionnelle. Le code dans le bloc else n'est exécuté que si le bloc try se termine sans lever d'exception. Ceci est utile pour séparer le code qui doit s'exécuter en cas de succès du bloc try principal.

Modifions notre script de division pour inclure un bloc else.

Dans le WebIDE, ouvrez le fichier ~/project/try_except_else.py et ajoutez le code suivant :

try:
    numerator = int(input("Enter the numerator: "))
    denominator = int(input("Enter the denominator: "))
    result = numerator / denominator
except (ValueError, ZeroDivisionError):
    print("An error occurred: Invalid input or division by zero.")
else:
    print("Division successful!")
    print(f"Result: {result}")

Enregistrez le fichier et exécutez-le depuis le terminal :

python ~/project/try_except_else.py

Testez le script avec des entrées qui échouent et des entrées réussies :

  1. Saisissez 0 pour le dénominateur pour déclencher une exception.
  2. Saisissez des entiers valides et non nuls pour exécuter le bloc else.

Exemples de sorties :

Enter the numerator: 10
Enter the denominator: 0
An error occurred: Invalid input or division by zero.
Enter the numerator: 10
Enter the denominator: 2
Division successful!
Result: 5.0

Comme vous pouvez le constater, les messages dans le bloc else ne sont affichés que lorsque la division réussit. Si une exception se produit, le bloc except est exécuté et le bloc else est ignoré.

Assurer l'Exécution du Code avec la Clause finally

L'instruction try possède également une clause finally optionnelle. Le code à l'intérieur du bloc finally est toujours exécuté, qu'une exception se soit produite ou non dans le bloc try. Ceci le rend idéal pour les actions de nettoyage, telles que la fermeture de fichiers ou la libération de ressources, qui doivent avoir lieu dans tous les scénarios.

Ajoutons un bloc finally à notre exemple de division.

Dans le WebIDE, ouvrez le fichier ~/project/try_except_finally.py et ajoutez le code suivant :

try:
    numerator = int(input("Enter the numerator: "))
    denominator = int(input("Enter the denominator: "))
    result = numerator / denominator
    print(f"Result: {result}")
except (ValueError, ZeroDivisionError):
    print("An error occurred: Invalid input or division by zero.")
finally:
    print("Execution finished.")

Enregistrez le fichier et exécutez-le depuis le terminal :

python ~/project/try_except_finally.py

Exécutez le script avec des entrées qui échouent et des entrées réussies :

  1. Saisissez 0 pour le dénominateur pour déclencher une exception.
  2. Saisissez des entiers valides et non nuls.

Exemples de sorties :

Enter the numerator: 10
Enter the denominator: 0
An error occurred: Invalid input or division by zero.
Execution finished.
Enter the numerator: 10
Enter the denominator: 2
Result: 5.0
Execution finished.

Remarquez que le message "Execution finished." provenant du bloc finally est affiché dans les deux cas. L'exécution du bloc finally est garantie, ce qui en fait un endroit fiable pour le code de nettoyage essentiel.

Lever des Exceptions Personnalisées

Parfois, vous devez signaler une condition d'erreur qui n'est pas une exception Python intégrée. Vous pouvez le faire avec l'instruction raise, qui vous permet de créer et de déclencher vos propres exceptions. Ceci est utile pour rendre la gestion des erreurs de votre application plus spécifique et descriptive.

Voyons d'abord comment raise une exception intégrée. Dans le WebIDE, ouvrez le fichier ~/project/raise_exception.py et ajoutez le code suivant :

def check_positive(number):
    if number <= 0:
        raise ValueError("Input must be a positive number")
    print(f"The number {number} is positive.")

try:
    check_positive(-5)
except ValueError as e:
    print(f"Caught an exception: {e}")

try:
    check_positive(10)
except ValueError as e:
    print(f"Caught an exception: {e}")

Enregistrez le fichier et exécutez-le depuis le terminal :

python ~/project/raise_exception.py

La sortie sera :

Caught an exception: Input must be a positive number
The number 10 is positive.

Ici, la fonction check_positive lève une ValueError si l'entrée n'est pas positive, laquelle est ensuite capturée par le bloc except.

Maintenant, définissons et levons une exception personnalisée. Les exceptions personnalisées sont des classes qui héritent de la classe intégrée Exception.

Dans le WebIDE, ouvrez le fichier ~/project/custom_exception.py et ajoutez le code suivant :

class NegativeNumberError(Exception):
    """Custom exception raised for negative numbers."""
    pass

def process_positive_number(number):
    if number < 0:
        raise NegativeNumberError("Negative numbers are not allowed")
    print(f"Processing positive number: {number}")

try:
    process_positive_number(-10)
except NegativeNumberError as e:
    print(f"Caught custom exception: {e}")

try:
    process_positive_number(20)
except NegativeNumberError as e:
    print(f"Caught custom exception: {e}")

Enregistrez le fichier et exécutez-le depuis le terminal :

python ~/project/custom_exception.py

La sortie sera :

Caught custom exception: Negative numbers are not allowed
Processing positive number: 20

Dans cet exemple, nous avons défini notre propre NegativeNumberError et l'avons levée sous une condition spécifique. Le bloc try...except capture ensuite spécifiquement ce type d'erreur personnalisé, rendant la gestion des erreurs plus précise.

Résumé

Dans ce laboratoire, vous avez appris à implémenter une gestion des erreurs robuste en Python. Vous avez commencé par utiliser un bloc try...except pour intercepter une ValueError spécifique provenant de l'entrée utilisateur. Vous avez ensuite étendu cela en gérant plusieurs types d'exceptions, à la fois séparément et dans un bloc unique. Vous avez également appris à utiliser la clause else pour exécuter du code uniquement lorsqu'aucune exception ne se produit, et la clause finally pour exécuter le code de nettoyage dans toutes les situations. Enfin, vous vous êtes exercé à créer et à lever des exceptions personnalisées pour gérer les erreurs spécifiques à l'application, rendant votre code plus lisible et maintenable.