Aller au contenu

Nouveau membre ?! Pense à te présenter pour accéder au contenu du forum !

New member ?! Introduce yourself to get access to the forum !

Takuma

 tutoriel / partage Les erreurs en Python

Messages recommandés

Bonjour à tous !

 

Comme tout en informatique, Python peut avoir des erreurs, par différents facteurs

  • La machine qui exécute le programme,
  • Celui qui se sert du programme,
  • Celui qui a développé le programme
  • etc...

Plusieurs types d'erreurs existent. Certaines, sont visible, les plus faciles à résoudre. D'autres sont-elles totalement invisible, il est en conséquence très dur de les voir, ce qui implique la dureté de les corriger.

 

En Python, et comme pour beaucoup de langage, si ce n'est pas tous, on appelle les erreurs des "exceptions". Ces erreurs sont des exceptions à la règle.

 

Afin de corriger, intercepter les erreurs vous devez avoir des informations :

  • De quel(s) type(s) est l'erreur ?
  • D'où vient l'erreur ?
  • Qu'est ce qui provoque l'erreur ?

Python a beaucoup de messages pour de nombreux cas, mais dans votre programme, des erreurs bien particulières peuvent se créer, vous devez donc des fois créer vous même vos "codes d'erreur", vous devez donc dans cette lancer prévoir les différentes erreurs possible, et ceci n'est pas simple.

 

Cependant, ne pensez pas que vous allez pouvoir faire une programme "parfait" et sans erreurs. Selon la machine utilisée, l'utilisateur, etc... plusieurs bogues peuvent être crées sur votre programme. N'oubliez pas que l'ordinateur ne fait que suivre vos instructions, il est bête, il ne peut pas savoir ce que vous pensez, il se contente de faire à la lettre ce que vous lui dites de faire.

 

Il faut ensuite que vous compreniez qu'il y a plusieurs erreurs possible. Elles ne surgissent pas au même moment. Vos erreurs peuvent surgir :

  • Lors de la compilation
  • Lors de l’exécution

Lors de la compilation, on pourra distinguer énormément de facteur :

  1. Vous avez oublié quelque chose dans votre code.
  2. Vous manquez d'une librairie.
  3. Vous avez effectué une faute de frappe.
  4. etc...

On distingue les fautes d'exécution par le faite qu'elles surviennent lors de l'exécution de votre programme et non son lancement. Les facteurs comme les fautes de frappe ne sont pas non plus à oublier de ce côté là. Il faut également retenir qu'une erreur d'exécution ne va pas toujours vous générer une exception. Elles peuvent par exemple se manifester par un gel (dit plus couramment freeze) de votre programme, qui le rend totalement inutilisable.

 

On distingue d'un autre côté les erreurs comme :

  • Erreurs de syntaxe : Vous avez fait une faute de frappe, ces erreurs n'empêchent pas toutes la compilation du programme.
  • Erreurs de logique : Vous vous êtes trompé dans vos "if" par exemple, un mauvais opérateur et le résultat est une belle erreur toute fraîche.
  • Erreurs sémantiques : Par exemple, une erreur au niveau de vos tabulations, vos boucles s'exécutent une fois de trop, votre programme est faux, mais pour l'ordinateur tout ce passe bien.

Les erreurs sont variées et parfois très difficile à découvrir. Même si maintenant Python reconnait beaucoup d'exceptions, vous allez quand même devoir apprendre à vous préparer contre les dures erreurs de notre ami Python.

 


 

Pour vous faire comprendre, je vous propose de prendre ce programme :

try:
    Value = int(input("Tapez un nombre entre 1 et 20 :"))
except ValueError:
    print("Vous devez taper un nombre entre 1 et 20 !")
else:
    if(Value>0) and (Value <=20):
        print("Vous avez tapé un nombre correct")
    else:
        print("Le nombre tapé est incorrect")

L'utilisation du bloc try est fait pour prévoir une erreur et la traitée.

Ce bloc try ne gère que les erreurs qui se trouvent dans son bloc. Je vous vois déjà arriver à dire : "Bah il suffit de mettre tout mon programme dans un bloc try". Et bien permettez moi de vous répondre un nom catégorique, plus votre bloc try sera centré sur un problème, court et précis, plus il serra éfficace et util.

Ici, si un utilisateur entre une autre valeur que celles attendues par exemple, des lettres :

  • Le bloc except recherche une exception spécifique, dans ce cas le "ValueError".
  • Si l'utilisateur génère une autre exception, except ne pourra pas la gérer.

Vous voyez avec ce code que si vous tapez un nombre comme 22, on vous dit de respecter l'intervalle [1;20] demandé. Effectivement, pour le bloc d'erreur ce n'est pas une exception, on va devoir comme ici la traiter ailleurs.

 


Je vais traiter une partie ici beaucoup plus dur que celle du haut. Comprenez réellement celle du haut avant de commencer à lire celle-ci.

 

La plus part des exceptions ne fournissent pas d'arguments. Il existe cependant quelques erreurs qui fournissent des arguments. Je traiterais je pense cet aspect dans un autre tutoriel, mais je vais quand même vous expliquer brièvement.

 

Prenons ce bout de code :

import sys


try:
    File = open('fichier.txt')
except IOError as e:
    print("Erreur lors de l'ouverture ! \r\n"+ "Numéro de l'erreur : {0}\r\n".format(e.errno) + "Description de l'erreur : {0}".format(e.strerror))
else:
    print("Réussis !")
    File.close():

 

J'utilise dans cette exemple des erreurs assez avancées pour les débutants. 

Si vous ne connaissez pas le import, il sert à importer le code d'un autre fichier python (on a juste a taper : import [Nom du fichier sans son extension]). La fonction open elle sert à ouvrir un fichier, même si je pense que vous aurez compris ceci.

Imaginons que ce fichier nommer "fichier.txt" n'existe pas. On a donc une erreur. Python va donc ici nous retourner notre print (le plus long) contenant le résumé de l'erreur :

  • errno : On y fait appelle pour que le système d'exploitation nous retourne le numéro complet de l'erreur.
  • strerror : L'abrévation de StringError, soit le texte de l'erreur, cela nous renvoie donc une chaîne de caractères décrivant la nature de l'exception.

Le mot as est une clause; La clause as nous permet de "placer" l'erreur dans la variable e, c'est plus facile pour y accéder ensuite.

 


Certains programmes peuvent générer plusieurs erreurs pour une ligne. Je vais donc vous montrer maintenant comme gérer plusieurs exceptions avec une et une seule clause except.

Cette méthode est à utiliser si les erreurs gérées par la clause except ont le même type. Si elles n'ont pas le même, il va falloir créer un bloc pour chaque erreur.

 

Prenons pour cette exemple presque le même code qu'avant, il sera modifié pour vous montrer ceci.

try:
    Value = int(input("Tapez un nombre entre 1 et 20 :"))
except (ValueError, KeyboardInterrupt):
    print("Vous devez taper un nombre entre 1 et 20 !")
else:
    if(Value>0) and (Value <=20):
        print("Vous avez tapé un nombre correct")
    else:
        print("Le nombre tapé est incorrect")

Le code est presque le même qu'avant cependant, il gère maintenant deux choses dans la clause except. Vous pouvez remarquer que ces exceptions sont entre parenthèses et séparées par une virgule, retenez le, ça sera toujours comme ceci.

 

 

Je vous conseille cependant de créer une clause except pour chaque erreur avec sa propre erreur, car sur le code ci-dessus, si on vous retourne :

 

Vous devez taper un nombre entre 1 et 20 !

 

Vous allez dire à votre ordinateur : "Okey très bien merci, mais c'est quoi l'erreur ? ValueError ou KeyboardInterrupt ?

Vous pouvez donc les séparer comme ceci:

try:
    Value = int(input("Tapez un nombre entre 1 et 20 :"))
except ValueError:
    print("Vous devez taper un nombre entre 1 et 20 !")
except KeyboardInterrupt:
    print("Vous avez appuyé sur une mauvaise touche ! ")
else:
    if(Value>0) and (Value <=20):
        print("Vous avez tapé un nombre correct")
    else:
        print("Le nombre tapé est incorrect")

Ici, chaque clause a :

  • Une seule et unique erreur
  • Une description unique permettant de vite remarquer le problème.


Je fais ici un petit espace pour vous préciser quelques choses :

  • Pour faire vos erreurs, vous devez aller de l'erreur la plus générale à la plus précise.
  • Prendre le temps de marquer vous erreur vous prends du temps au développement mais beaucoup moins de temps au débogage.
  • Vous l'aurez compris, il n'y a que des atouts.


 

Vous pouvez comme toutes les balises en Python imbriquer les exception. Vous pouvez donc par exemple très bien taper un try dans un autre try, le temps que l'indentation est respectée, cela ne pose aucun problème à Python. Avant de faire ceci, souvenez vous tout du moins ce cette règle :

  • Pour faire vos erreurs, vous devez aller de l'erreur la plus générale à la plus précise.

En effet, imaginons l'exception B qui se trouve dans la A. La B ne sera pas exécute si A n'et pas validé.

Ceci implique que plus vos erreurs seront du général au plus précis, mieux vous allez pouvoir savoir d'où viennent vos erreurs.

Un programme clair avec des codes d'erreurs variés pour chaque action, est un programme facile a corriger et donc il est mis en ligne totalement fonctionnel.


Hum, bien il ne me reste plus que trois points à vous apprendre et vous serez incollable sur les erreurs en Python !

 

Il est bien beau d'avoir des erreurs et de les traiter, mais vous pouvez avoir besoin d'utilisation des informations du bloc try en dehors de celui-ci. Cependant mettre un print avec une valeur sortie du bloc try hors de lui serait totalement absurde, je m'explique : Imaginons que vous n'avez aucune erreur, et bien c'est votre print qui va vous en générer une comme le bloc try n'a pas généré de message, tapons :

try:
    EX = ValueError()
    Ex.strerror = "Ceci est un message d'erreur"
    raise Ex
except ValueError as e:
    print("Exception ValueError: ", e.strerror)

 

Ici, si il y a une erreur (ce code génère forcément une erreur de toute façon), Python nous renvoie :

 

Exception ValueError: Ceci est un message d'erreur

 

Facile à comprendre non ? :)


Il faut maintenant que vous sachiez que malgré le nombre impressionnant d'erreurs que peux traiter Python, il arrive qu'il n'est rien prévue pour une certaine erreur avec des modules complémentaires par exemple. Nous allons donc créer nos propres exceptions. Il vous faut également savoir que pour en créer une, vous devez partir d'une erreur déjà existante.

Pour ceci, nous allons utiliser une classe spécial pour notre exception personnalisé, tapez :

class CustomValueError(ValueError):
    def __init__(self,arg):
        self.strerror = arg
        self.args = {arg}

try:
    raise CustomValueError("Ceci est un message d'erreur")
except CustomeValueError as e:
    print("Exception CustomValueEoor : ", e.strerror)

Je vous donne une explication du code, car sinon vous allez trouver ça barbare :

On commence par créer une classe nommée CustomValueError qui reprend les valeurs de départ de ValueError.

La fonction __init__ est une fonction permettant de créer une nouvelle instance, l'attribut strerror prend donc la valeur qui lui est attribué, tandis que arg la reçoit sous forme d'une chaine.

 


Pour finir, en dernier point je vous propose de traiter de la clause finally (elle porte bien son nom pour la fin du tutoriel non ?):

Certaines exceptions font que votre programme n'est voué qu'à une seule chose : crasher.

Cette clause va donc essayer de le faire crasher "en douceur".

 

Disons que finally va effectuer des tâches de derrière minute afin de ne rien endommager. Cette clause est souvent brève, elle ne doit contenir que l'essentiel.

Par exemple... tapez :

import sys

try:
    raise ValueError
    print("Exception levée:")
except ValueError:
    print("Exception ValueError!")
    sys.exit()
finally:
    print("Prenez soin des détails de dernière minute !")
print("Ce code ne sera jamais exécuté.")

 

 

Ici, si il se passe une erreur notre explication va se fermer (sys.excit()) donc le dernier print ne sera jamais exécuté. Cependant la clause finally sera elle toujours exécutée.

La clause finally sera toujours exécutée, vous devez donc l'utiliser avec des arguments général, et avec précaution.

 


C'est la fin de ce tutoriel, merci si vous avez pris le temps de le lire.

 

Je suis prêt à répondre à vos questions dans la section prévue pour.

 

Cordialement, Takuma.

~Tutoriel entièrement rédigé par mes soins. Copie interdite sans autorisation. Merci.

Partager ce message


Lien à poster
Partager sur d’autres sites

[glow=grey]

 

Wahou...

Grandiose, merci à toi :)

 

[/glow]

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est pas grand chose ^^'

 

Cordialement, Takuma.

Partager ce message


Lien à poster
Partager sur d’autres sites

[glow=silver]

 

Je valide ton partage, merci à toi :)

 

[/glow]

Partager ce message


Lien à poster
Partager sur d’autres sites

×

Information importante

By using this site, you agree to our Conditions d’utilisation.