Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Gestion d'exceptions Python

3 réponses
Avatar
zeuwi
Bonjour,

J'ai ce bout de code, j'ai levé une exception, mais je m'étonne de voir pourquoi le code continue de tourner alors même que cette dernière lève une exception.
Lors des tests dans l'interpréteur, le rentre volontairement une année négative, une erreur est bien levée cependant j'ai le résultat qui ressort et m'indique qu'il s'agit d'une année non bissextile par exemple. Est ce bien comme cela qu'une exception doit fonctionner?

année = input("e;veuillez saisir une année: "e;)

try:
année = int(année)
if année <= 0:
raise ValueError("e;L'année saisie est négative ou nulle"e;)
except ValueError:
print('Erreur lors de la conversion de l'année')

if année % 400 == 0 or (année % 4 == 0 and année % 100 !=0):
print("e;Bisextile"e;)
else:
print("e;Non Bisextile"e;)

Merci pour votre aide
Cdt,

3 réponses

Avatar
Alain Ketterlin
zeuwi writes:
J'ai ce bout de code, j'ai levé une exception, mais je m'étonne de
voir pourquoi le code continue de tourner alors même que cette
dernière lève une exception. Lors des tests dans l'interpréteur, le
rentre volontairement une année négative, une erreur est bien levée
cependant j'ai le résultat qui ressort et m'indique qu'il s'agit d'une
année non bissextile par exemple. Est ce bien comme cela qu'une
exception doit fonctionner?

La clause "except" traite/intercepte l'exception, il sert Í  cela.
L'exception est donc interceptée, et le code se poursuit normalement.
C'est exactement ce qui doit se passer.
try:
année = int(année)
if année <= 0:
raise ValueError("e;L'année saisie est négative ou nulle"e;)
except ValueError:
print('Erreur lors de la conversion de l'année')

Le traitement de ton exception consiste ici Í  afficher un message (puis
Í  continuer comme si de rien n'était). Ce n'est presque jamais une bonne
idée.
Si tu ne veux pas intercepter l'exception : enlève try et sa clause
except (et aussi print).
Si tu veux afficher un message et "re-déclencher" l'exception, utilise
except ValueError:
print (...)
raise
Tu peux aussi donner explicitement un nom Í  l'exception
except ValueError as e:
print (...)
raise e
Dans ce cas, le message sera affiché par print, et la suite du code ne
sera pas exécutée (jusqu'Í  ce qu'un autre bloc try/except intercepte
l'exception).
Dans ton cas, tu veux manifestement ne pas faire le calcul en cas
d'erreur. Le code devrait être
année = input("e;veuillez saisir une année: "e;)
try:
année = int(année)
if année <= 0:
raise ValueError("e;L'année saisie est négative ou nulle"e;)
if année % 400 == 0 or (année % 4 == 0 and année % 100 !=0):
print("e;Bisextile"e;)
else:
print("e;Non Bisextile"e;)
except ValueError:
print('Erreur lors de la conversion de l'année')
J'ai laissé ces saloperies de '"e;' mais ça serait bien que tu nous les
épargnes. (Ou alors est-ce juste chez moi ?)
Cdt,

Sans commentaire.
-- Alain.
Avatar
Olivier Miakinen
Le 28/12/2021 Í  16:52, Alain Ketterlin a écrit :
J'ai laissé ces saloperies de '"e;' mais ça serait bien que tu nous les
épargnes. (Ou alors est-ce juste chez moi ?)

Ce n'est ni toi ni zeuwi qui êtes responsable de ces saloperies de
'"e;', c'est la saloperie de site giganews qui en est responsable
quand il rend visible un groupe usenet comme si c'était un forum
giganews.
--
Olivier Miakinen
Avatar
Alain Ketterlin
Olivier Miakinen <om+ writes:
Ce n'est ni toi ni zeuwi qui êtes responsable de ces saloperies de
'"e;', c'est la saloperie de site giganews qui en est responsable
quand il rend visible un groupe usenet comme si c'était un forum
giganews.

Merci pour l'info. Encourageons donc les utilisateurs de giganews Í 
changer de crèmerie. Personnellement j'utilise nntp.aioe.org.
-- Alain.