try except as else finally
try except as else finally
DESCRIPTION.
Exécute le script du bloc qui suit l'instruction try tant qu'il n'y a pas erreur. Si une erreur est détectée, continue le programme en exécutant le code dans le bloc except gérant le type d'erreur rencontrée, puis le bloc finaly s'il est présent.
SYNTAXE.
try :
code à tester
...
except exception :
code de gestion d'erreur trouvée
...
else :
code si aucune erreur
...
finally :
code de sortie de gestion d'erreur
...
try : ⇨ appel de l’instruction [ OBLIGATOIRE ]
code à tester ⇨ lignes de programme [ OBLIGATOIRE ]
except : ⇨ script à exécuter si une erreur est détectée [ OBLIGATOIRE ]
exception ⇨ identification de l'erreur à traitée [ optionnel ]
gestion d'erreur ⇨ script à exécuter si l'erreur est détectée [ OBLIGATOIRE ]
else : ⇨ script à exécuter si aucune erreur n'est détectée [ optionnel ]
finally : ⇨ script à exécuter obligatoirement [ optionnel ]
PRÉSENTATION GÉNÉRALE D'UN GESTIONNAIRE D'ERREUR.
try : (Déclaration d'un gestionnaire d'erreur)
ligne A1 (Début du code à tester avec gestionnaire d'erreur)
ligne A2
ligne An (aller à E1 si else est présent, sinon à F1 si finally est présent, sinon à S1)
except type_erreur_xx : (Si l'erreur xx est détectée faire le script suivant)
ligne B1
ligne B2
ligne Bn (aller à ligne F1 si finally est présent sinon ligne S1 )
except type_erreur_yy : (Si l'erreur yy faire le script suivant)
ligne C1
ligne C2
ligne Cn (aller à ligne F1 si finally est présent sinon ligne S1 )
except : (Si une erreur non traitée spécifiquement est détectée faire le script suivant)
ligne D1
ligne D2
ligne Dn (aller à ligne F1 si finally est présent sinon ligne S1 )
else : (Si aucune erreur n'est détectée faire le script suivant)
ligne E1
ligne E2
ligne En (aller à ligne F1 si finally est présent sinon ligne S1 )
finally : (fin de la gestion des erreur)
ligne F1 (partie du script à exécuter obligatoirement)
ligne F2
ligne Fn (sortie du gestionnaire d'erreur, continuer l'exécution du script à ligne S1 )
ligne S1 (suite du script)
ligne S2
ligne Sn
REMARQUES.
try est une instruction composée (de plusieurs lignes), ce qui implique le symbole : (2 points) terminant l'appel de try et l'indentation des lignes de script composant le bloc d'instructions à exécuter.
Les lignes de script qui suivent l'instruction try : sont exécutées normalement, sauf si une erreur est détectée (exception levée). Le code fautif est alors "excusé" et le bloc d'instructions except relatif à ce type d'erreur est exécuté, ou à défaut, le bloc except sans type d'erreur (s'il est présent).
Si aucune erreur n'est levée, les instructions du bloc else sont exécutées, s'il est présent.
Qu'il y ait eu une exception levée ou non, le bloc finally sera toujours exécuté, s'il est présent.
Seules les exceptions levées dans le bloc try sont traitées. Si l'exception survient dans un bloc except, else ou finally, cette exception n'est pas traitée, sauf si un bloc try est imbriqué dans le script ces blocs.
On notera que :
- si il est présent, le bloc finally est toujours exécuté, qu'une exception soit trouvée ou pas ;
- si il est présent, le bloc else n'est exécuté que si aucune exception n'est levée dans le bloc try ;
- si l'exception levée est gérée par un bloc except spécifique (avec except TypeException ) c'est ce bloc qui sera exécuté ;
- si un bloc except générique (sans type d'erreur particulier) est présent, il sera exécuté pour toute erreur rencontrée dans le bloc try. et non traitée par une clause except spécifique.
Si une instruction break ou continue se trouve dans une boucle, for ou while d'un bloc except, qui force le script à sortir de la fonction, contenant le bloc testé avec l'instruction try, les blocs else et finally seront tout de même exécutés.
Les instructions break et continue ne doivent jamais se trouver dans un bloc finally.
La syntaxe except Exception as variable : d'un bloc except générique (sans type d'erreur particulier) retourne le nom de la classe de l'erreur dans la variable située après le mot clé as.
PARTICULARITÉS DE LA CLAUSE EXCEPT.
Quand une exception est rencontrée dans le bloc de script try, une valeur peut lui être affectée, appelée l’argument de l’exception. La présence de cet argument et son type dépendent de l’exception.
L'instruction except peut affecter dans une variable, le nom de l’exception. Cette variable est une instance d’exception avec les arguments stockés dans variable.args. Pour plus de commodité, l’instance de l’exception définit la méthode __str__ ( ) afin que les arguments puissent être affichés directement sans avoir à référencer .args. Il est possible de construire une exception, y ajouter ses attributs, puis la lever plus tard.
try :
print ( "Python" / 3.9 )
except Exception as kerreur :
print ( f"Nature de l'exception : { type ( kerreur ) }" )
print ( f"Arguments de l'exception : { kerreur.args }" )
print ( f"Méthode __str ( )__ de l'exception : { kerreur }" )
retourne :
Nature de l'exception : <class 'TypeError'>
Arguments de l'exception : ("unsupported operand type(s) for /: 'str' and 'float'",)
Méthode __str ( )__ de l'exception : unsupported operand type(s) for /: 'str' and 'float'
Il est possible de préciser plusieurs codes d'erreur à traiter dans une même clause except. Dans ce cas, il faut nommer toutes les erreurs dans un tuple ( ) : except ( exception1 , exception2 , exceptionn ) :
Dans un bloc try, on peut inclure plusieurs clauses except pour permettre la gestion de plusieurs types d'erreurs, pouvant survenir à cet instant du programme, mais seul le premier type d'erreur trouvé sera exécuté. En effet, après avoir traité le code d'un bloc except, le programme sort de la clause try.
L'instruction except peut être employée sans aucun nom d'erreur. Dans ce cas le script de ce bloc sera exécuté quelque soit l'exception levée. Cette astuce pourra être placée en dernier pour traiter toutes les erreurs non prévues. Cependant il faut l'utiliser avec beaucoup de précaution pour ne pas faire "tromper" le programme plus loin dans le traitement. On pourra, par exemple :
- stoker le type de l'exception dans une variable avec except Exception as kerreur : ;
- afficher un message indiquant une erreur non traitée, puis ;
- arrêter proprement le programme en enregistrant les données et en fermant les fichiers ;
- ou en déviant le programme sur une fonction d'erreur générale que l'on aurait pris soin de définir.
ERREURS LES PLUS FREQUENTES.
AssertionError ⇨ Une exception est levée avec l'instruction assert
AttributeError ⇨ L'attribut n'existe pas (pour cette fonction)
ImportError ⇨ Le module ne peut pas être importé (avec import ou from)
IndentationError ⇨ L'indentation est mauvaise
IndexError ⇨ L'index n'existe pas ( list ( ), tuple ( ), ...)
IOErreor ⇨ Erreur de lecture ou d'écriture sur un périphérie
KeyError ⇨ La clé n'existe pas ( dict ( ) )
MemoryError ⇨ La mémoire est saturée ou insuffisante
NameError ⇨ La variable (le nom) n'existe pas
NotImplementedError ⇨ C'est un descendant qui doit être implémenté
OSError ⇨ Le système d'exploitation à retournée une erreur
OverflowError ⇨ Dépassement de capacité dans un calcul avec int ( ))
TabError ⇨ Les tabulations ne sont pas identiques
TypeError ⇨ Le type des variables ne corresponds pas a l'opération
UnicodeDecodeError ⇨ Le décodage des caractères produit un conflits
UnicodeEncodeError ⇨ Le codage des caractères produit un conflits
ValueErreur ⇨ Le type de valeur est incompatible avec l'opération
ZeroDivisionError ⇨ La division pas 0 est impossible
PARTICULARITÉS DE LA CLAUSE FINALLY.
finally est une instruction composée (de plusieurs lignes), ce qui implique le symbole : (2 points) terminant l'appel de finally et l'indentation des lignes de script composant la définition de la fonction.
finally est un bloc optionnel de l'instruction try. Si elle est présente, le code de finally sera toujours exécuté même si une instruction return, break ou continue a été rencontré.
EXEMPLES.
def FNC_Division ( Qa , Qb ) :
try :
print ( Qa / Qb )
LST_Voyelles = [ "a" , "e" , "i" , "o" ,"u" , "y" ]
print ( LST_Voyelles [ Qa ] )
for kvaleur in range ( int ( Qa / Qb) ) :
print ( kvaleur * kvaleur )
except ZeroDivisionError :
print ( "il y a une division pas zéro. C'est impossible !" )
except Exception as kerreur :
if isinstance ( kerreur , TypeError ) :
print ( "Vous devez saisir uniquement des nombres." )
else :
print ( "Il y a une erreur de type : ", type ( kerreur ) )
else :
print ( "Pas d'erreur standard trouvée !" )
finally :
print ( "Recommencez un nouvel essais ..." )
FNC_Division ( 4 , 0 )
retourne
il y a une division pas zéro. C'est impossible !
Recommencez un nouvel essais.
car print ( 4 / 0 ) (de print ( Qa / Qb ) dans la définition de la fonction) lève une exception qui est gérée par la ligne except ZeroDivisionError : le code dans le bloc qui suit cette gestion est exécutée, puis le bloc finally, puis sortie du bloc try.
FNC_Division ( 4 , "a" )
retourne
Vous devez saisir uniquement des nombres
Recommencez un nouvel essais.
car print ( 4 / "a" ) (de print ( Qa / Qb ) dans la définition de la fonction) lève une exception, car on ne peut pas diviser un nombre par une lettre, qui est gérée par le bloc except exception as kerreur : le code dans le bloc qui suit cette gestion est exécutée, puis le bloc finally, puis sortie du bloc try.
FNC_Division ( 10 , 2 )
retourne
5.0
Il y a une erreur de type <class 'IndexError'>
Recommencez un nouvel essais.
car print ( LST_Voyelles [ 10 ] ) (de print ( LST_Voyelles [ Qa ] )) lève une exception, car l'index 10 n'existe pas dans la liste des voyelles, qui est gérée par le bloc except Exception as kerreur : le code dans le bloc qui suit cette gestion est exécutée, puis le bloc finally, puis sortie du bloc try.
FNC_Division ( 4 , 2 )
retourne
2.0
u
0
1
Pas d'erreur standard trouvée !
Recommencez un nouvel essais.
Il n'y a aucune erreur (de codage) dans bloc try. Le bloc est entièrement exécutée, puis le bloc else, et enfin le bloc finally, et sortie du bloc try.
Votre aide est précieuse pour améliorer ce site, alors n'hésitez pas à faire part de
Dans la LOGITHEQUE de MON PYTHON PAS A PAS
vous trouvez des suggestions de projets simples et classiques pour
ooo
TESTER - DÉCOUVRIR - PRATIQUER - APPROFONDIR - EXPLORER
ooo
la programmation récréative avec le langage PYTHON 3
avec un exemple de résolution à télécharger pour vous inspirer.