Bloc try et except
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 !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte