Résolue

Bloc try et except

# Structures conditionnelles # Système d'exploitation

bonjour a tous j'aimerais savavoir si dans le bloc try ne contien pas pas d'erreur est qu'on definie des type d'erreur dans les bloc except esque on est obliger de mettre le else ou le finally a la fin pour pas que python ne rentre dans les bloc except merci 🤩

Salut Mohammed !

Non, tu n'es pas obligé de mettre un bloc else ou finally à la fin d'un bloc try...except. Si le bloc try ne contient pas d'erreur ou que les erreurs sont gérées correctement dans les blocs except que tu as défini, le programme continuera simplement son exécution normale après les blocs except.

Je te donne des exemples de code, c'est toujours plus clair comme ça ;)

try:
    # Code qui pourrait potentiellement causer une erreur
except SpecificError:
    # Code qui gère une erreur spécifique
except AnotherError:
    # Code qui gère une autre erreur

# Le programme continue ici, avec ou sans else/finally

Si tu rajoutes un bloc else, il est exécuté si le bloc try ne génère aucune exception, mais il est totalement optionnel :

try:
    # Code qui pourrait potentiellement causer une erreur
except SpecificError:
    # Code qui gère une erreur spécifique
else:
    # Code exécuté si aucune exception n'est levée

Pour le bloc finally, ce qu'il est important de comprendre c'est que le code sera exécuté, peu importe l'erreur générée et peu importe si tu la gère ou non dans un bloc except.

Par exemple avec ce code, même si tu as une erreur de division par 0, qui est ici gérée dans le except ZeroDivisionError, le bloc finally sera exécuté.

def division(x, y):
    try:
        result = x // y
    except ZeroDivisionError:
        print("Impossible de diviser par 0 !")
    else:
        print("Le résultat de la division est :", result)
    finally:
        print('Opération terminée.')

division(3, 0)  # Affiche "Impossible de diviser par 0 !" et "Opération terminée."

Mais même si tu ne gères pas cette erreur avec un except, et qu'une autre erreur est levée par Python, le code sera exécuté également :

def division(x, y):
    try:
        result = x // y
        print(f'{x} // {y} = {result}')
    finally:
        print('Opération terminée.')

division(3, 0)  # Affiche "Opération terminée." en plus de faire planter le script.

Ce qui ne sera pas le cas si tu mets juste le print après un bloc try / except :

def division(x, y):
    try:
        result = x // y
        print(f'{x} // {y} = {result}')
    except ValueError:
        print('Erreur de valeur.')

    print('Opération terminée.')

division(3, 0)  # Le script plante avec une "ZeroDivisionError: integer division or modulo by zero" sans afficher le "Opération terminée."

Dans le code ci-dessus, comme tu ne gères que l'erreur ValueError et que le script lève une erreur ZeroDivisionError, le script plante, et s'arrête sans passer par le print Opération terminée..

Le bloc finally est donc très important si tu as des opérations de nettoyage à faire qui doivent être absolument effectuée, même si ton script plante.

Imagine que tu as ouvert une connexion à ta base de données et qu'une erreur que tu n'as pas prévu dans un bloc except se passe : si tu n'utilises pas le bloc finally, tu ne refermeras pas ta connexion ce qui peut causer pas mal de soucis. Avec le bloc finally tu t'assures que peu importe les erreurs, prévues ou imprévues, qui arrivent, ta connexion sera correctement fermée.

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi Ă  Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.