Annonce

Réduire
Aucune annonce.

Les erreurs de syntaxe et les exceptions - COURS N°7

Réduire
Ceci est une discussion importante.
X
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Tutoriel Les erreurs de syntaxe et les exceptions - COURS N°7

    Bonjour,

    À savoir : Ce tutoriel risque d'être modifié, changé de place, voir même supprimé selon les décisions de l'équipe hackademics. Sa présence, est dû aux attentes des membres du forum participant au cours Python.

    Tout conseils, modifications à votre demande, sera envoyé par MP.

    QU'EST-CE QU'UNE ERREUR DE SYNTAXE ?

    Une erreur de syntaxe est visible sur votre interpréteur par une petite flèche vous indiquant l'endroit, ainsi que par ce message :

    Envoyé par interpréteur
    SyntaxError: invalid syntax
    L'interpréteur est simplement entrain de vous dire qu'il ne reconnaît pas ce langage. En d'autre termes, vos mots clés n'existent pas en python, où vous ne l'avez pas écris correctement, une majuscule/minuscule en trop, etc...

    QUE FAIRE?

    Relire tout simplement la documentation, en faisant attention de respecter scrupuleusement la façon dont est écrite la fonction.

    QU'EST-CE QU'UNE EXCEPTION?

    Même si votre syntaxe est correcte, vous n'êtes pas à l'abri. Imaginons que vous souhaitiez diviser un nombre par zéro, vous savez que cela n'est pas possible, eh bien python ne peut pas faire mieux non plus

    Code:
    >>> 2/0
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ZeroDivisionError: division by zero
    Nous avons donc une exception de type ZeroDivisionError qui indique que vous avez fait une division par zéro.

    Mais des exceptions, il y en a plein, comme vous pouvez le voir sur la documentation...

    Seulement on a pas toujours envie que le programme s'arrête, comme on ne voudrait pas que lors d'une division par zéro, il y est une erreur, mais une valeur par défaut.

    Voici une possibilité afin de manipuler une exception de type ZeroDivisionError.

    Code:
    def div(a, b, default=0):
        if b == 0:
            return default
        return a/b
    J'ai une fonction div retournant la division de a par b
    Comme on le voit dans ce code, si le dénominateur vaut 0, on retournera la valeur par defaut, ici default.

    En pratique, voici la démonstration :

    Code:
    >>> div(4, 2)
    2.0
    >>> div(4, 0)
    0 # la valeur default vaut 0 par défaut dans notre fonction div
    >>> div(4, 0, 2)
    2 # la valeur default vaut 2
    Pour cela un plan s'impose

    Autre manipulation possible des exceptions
    Comment fonctionne la déclaration try-except?
    Peut-on manipuler plusieurs exceptions?
    Lever une exception (la vôtre)

    I) AUTRE MANIPULATION POSSIBLE DES EXCEPTIONS

    Une autre possibilité est d'utiliser la déclaration try-except.

    Dans l'exemple précédent, on peut écrire notre code de cette façon...

    Code:
    def div(a, b, default=0):
        try:
            return a/b
        except ZeroDivisionError:
            return default
    Le résultat sera le même

    Code:
    >>> def div(a, b, default=0):
    ...     try:
    ...         return a/b
    ...     except ZeroDivisionError:
    ...         return default
    ... 
    >>> div(4, 2)
    2.0
    >>> div(4, 0)
    0
    >>> div(4, 0, 2)
    2
    Bien-sûr il y a d'autres syntaxes possibles de try-except, je vous laisse découvrir tout cela dans la documentation tranquillement.

    II) COMMENT FONCTIONNE LA DÉCLARATION TRY-EXCEPT?
    1) Les lignes de code à l'intérieur du try sont exécutées
    2) Si pas d'exception découverte, alors la partie code sous except est ignorée
    3) Si une exception, alors on stoppe l'exécution du code dans la partie try, on recherche si l'exception levée se trouve dans except ... Si c'est le cas, il exécute le code de la partie except
    4) Si une exception, mais qu'elle n'est pas trouvée dans except ... le programme s'arrêtera avec une erreur vous indiquant l'endroit et le type d'erreur

    III) PEUT-ON MANIPULER PLUSIEURS EXCEPTIONS?

    Oui c'est possible, imaginons que vous vouliez contrôler les erreurs de l'utilisateur.
    Au lieu d'un nombre il rentre une lettre 2/a par exemple. On pourrait retourner notre valeur par défaut pour éviter que notre programme stoppe.

    Comment savoir quelle erreur est levée par l'interpréteur? Facile, regardez!

    Code:
    >>> 2/"a"
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unsupported operand type(s) for /: 'int' and 'str'
    Une exception de type TypeError est levée, il suffit de maintenant la contrôler dans notre code.

    Code:
    def div(a, b, default=0):
        try:
            return a/b
        except (ZeroDivisionError, TypeError):
            return default
    Code:
    >>> div(2, "a")
    0
    On a bien une erreur que l'on gère de la façon que l'on souhaite et non imposée par l'interpréteur.

    IV) LEVER UNE EXCEPTION (la vôtre)

    Imaginons que lors d'une erreur d'entrée du second argument, vous souhaitiez interrompre le programme, mais à votre sauce.

    C'est possible! On utilisera le mot clé raise.

    Code:
    def div(a, b):
        if b == 0:
            raise Exception("Entrer un nombre différent de 0")
        return a/b
    Le test :

    Code:
    >>> div(4, 0)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "./test.py", line 3, in div
        raise Exception("Entrer un nombre différent de 0")
    Exception: Entrer un nombre différent de 0
    En ce qui concerne les exercices, vous pouvez utiliser ce cours pour rendre la gestion des erreurs entrées utilisateur de vos codes précédents (des autres cours).

    Bonne journée,
    Dernière modification par fred, 07 juin 2013, 14h47.
Chargement...
X