python:bases:exceptions

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
python:bases:exceptions [2021/06/30 20:42] – [Résumé] philpython:bases:exceptions [2022/12/16 12:48] (Version actuelle) phil
Ligne 1: Ligne 1:
 +[[:python:accueilpython|{{ :iconemaison.jpg?nolink&30|Sommaire Python et microPython}}]]
 +
 +===== Python - Test, exceptions, assertions et module doctest =====
 +[Mise à jour le : 16/12/2022]
 +
 +  * **Sources** 
 +    *  **Documentation** sur Python.org : <html><html><a href="https://docs.python.org/fr/3.6/reference/index.html" target="_blank">référence du langage</a>, <a href="https://docs.python.org/fr/3/tutorial/errors.html?highlight=exceptions" target="_blank">erreurs et exceptions</a></html>, <html><a href="https://docs.python.org/fr/3.5/library/functions.html" target="_blank">fonctions natives</a></html> (built-in)
 +    * Framework sur Github - <html><a href="https://github.com/nteract/testbook" target="_blank">testbook</a></html>
 +
 +  * **Mots-clés** : exceptions, assertions
 +
 +<callout type="warning" icon="true">Les mots ci-dessous sont dits "réservés". Ils ne peuvent pas être utilisés comme nom de variable. Les mots __soulignés__ sont une nouveauté de Python 3. Les mots en **gras** sont utilisés dans cette page.</callout>
 +
 +|  and          continue    |  **finally**  |  is            |  **raise**  |
 +|  as          |  def          for          |  lambda        |  return     |
 +|  **assert**  |  del          from          __None__      |  __True__   |
 +|  __async__    elif        |  global        __nonlocal__  |  **try**    |
 +|  __await__    **else**    |  if            not            while      |
 +|  break        **except**  |  import        or            |  with       |
 +|  class        __False__    in            **pass**      |  yield      |
 +
 +  * <html><a href="https://docs.python.org/fr/3.5/library/functions.html" target="_blank">Fonctions natives</a></html>** (built-in)**((Fonctions toujours disponibles.)) utilisées dans les exemples : **enumerate**(), **flush**(), **open**(), **print**(), **ranges**(), **repr**().
 +
 +----
 +
 +==== Introduction ====
 +Quand Python rencontre une erreur dans le code, il **lève une exception**. Le traitement de ces exceptions permettra notamment de donner une réponse à une erreur produite par l'action de l'utilisateur (entrée de valeurs, etc.).
 +
 +==== 1. Exceptions ====
 +
 +=== 1.1 Forme minimale try ... except ===
 +
 +<code python *.py>
 +try:
 +    # Bloc de code à essayer
 +    pass
 +except:
 +    # Bloc qui sera exécuté en cas d'erreur
 +    pass
 +</code>
 +
 +//Exemple//
 +
 +<code python *.py>
 +age = input("Quel est votre âge ? ")
 +try:
 +    age = int(age)
 +    print("Vous avez", age,"ans")
 +except:
 +    print("Erreur lors de la conversion de votre âge !")
 +</code>
 +
 +//Résultat attendu//
 +
 +Quel est votre âge ? 35 \\
 +Vous avez 35 ans \\
 +\\
 +Quel est votre âge ? ldkfjg \\
 +Erreur lors de la conversion de votre âge ! \\
 +
 +<callout type="primary" icon="true">On intercepte toutes les erreurs sans les distinguer.</callout>
 +
 +=== 1.2 Forme complète try ... except ... finally===
 +
 +<code python *.py>
 +try:
 +    # Bloc de code à essayer
 +    pass
 +except <error_1>:
 +    # Ce bloc sera exécuté si l'erreur = <error_1>
 +    pass
 +except <error_2>:
 +    # Ce bloc sera exécuté si  l'erreur = <error_2>
 +    pass
 +except <error_n>:
 +    # Ce bloc sera exécuté si  l'erreur = <error_n>
 +    pass
 +else:
 +    # Ce bloc sera exécuté si le code du bloc try s'est exécuté sans erreur
 +    # else souvent omis et bloc placé dans try
 +    pass
 +finally:
 +    # Bloc exécuté qu'il y ait eu des erreurs ou non
 +</code>
 +
 +//Exemple//
 +
 +<code python *.py>
 +num = input("Entrée le numérateur  ")
 +denom = input("Entrée le dénominateur ")
 +resultat = 0
 +try:
 +    numerateur = int(num)
 +    denominateur = int(denom)
 +    resultat = numerateur / denominateur
 +except NameError:
 +    print("Le numérateur ou le dénominateur n'ont pas été définis")
 +except ValueError:
 +    print("Le numérateur ou le dénominateur possède un type incompatible avec la division.")
 +except ZeroDivisionError:
 +    print("Le dénominateur est égal à 0.")
 +else:
 +    print("Le résultat de la division est", resultat)
 +finally:
 +    print("On poursuit l'exécution du programme")
 +</code>
 +
 +//Résultat attendu//
 +
 +Entrer le numérateur  12 \\
 +Entrer le dénominateur 2 \\
 +Le résultat de la division est 6.0 \\
 +On poursuit l'exécution du programme \\
 +\\
 +Entrer le numérateur  12 \\
 +Entrer le dénominateur klkl \\
 +Le numérateur ou le dénominateur possède un type incompatible avec la division. \\
 +On poursuit l'exécution du programme  \\
 +\\
 +Entrer le numérateur  12 \\
 +Entrer le dénominateur 0 \\
 +Le dénominateur est égal à 0. \\
 +On poursuit l'exécution du programme \\
 +
 +=== 1.3 Lever une exception ===
 +<callout type="primary" icon="true">Pour lever une exception on utilise le mot-clé **raise**.</callout>
 +
 +<code python *.py>
 +raise TypeException("Message à afficher")
 +</code>
 +
 +==== 2. Les assertions ====
 +<callout type="primary" icon="true">Les assertions sont un moyen de s'assurer, avant de continuer , qu'une condition est respectée.</callout>
 +
 +// Syntaxe //
 +<code python *.py>
 +assert test
 +</code>
 +
 +//Exemple//
 +
 +<code python *.py>
 +val = input("Saisissez une valeur supérieure à 0 : ")
 +try:
 +    val=int(val)
 +    assert val>0
 +except ValueError:
 +    print("Ce n'est pas un nombre")
 +except AssertionError:
 +    print("La valeur n'est pas supérieure à 0 !")
 +</code>
 +
 +// Résultat attendu //
 +Saisissez une valeur supérieure à 0 : 6 \\
 +\\
 +Saisissez une valeur supérieure à 0 : 0 \\
 +La valeur n'est pas supérieure à 0 !
 +
 +
 +==== 2. Le module doctest ====
 +
 +  * **Source** : <html><a href="https://docs.python.org/fr/3/library/doctest.html#module-doctest" target="_blank">Test interactive Python examples</a></html> sur python.org
 +
 +<callout type="primary" icon="true">Le module doctest recherche des zones de texte ressemblant à des sessions Python interactives et les exécute pour en vérifier le bon fonctionnement. Principe et exemples <html><a href="https://franckchambon.github.io/ClasseVirtuelle/Term_NSI/doctest.html" target="_blank"><strong>ici</strong></a></html></callout>
 +
 +----
 +
 +==== Résumé ====
 +  * On peut intercepter les erreurs (ou exceptions) levées par le code avec **try... except... finally...**
 +  * La syntaxe d'une assertion est **assert test**.
 +  * Les assertions lèvent une exception **AssertionError** si le test échoue.
 +  * On peut lever une exception grâce au mot-clé **raise** suivi du type de l'exception et d'un message.
 +
 +----
 +
 +{{  :python:bases:realpython.png?nolin|}}
 +==== Pour aller plus loin ... ====
 +    * <html><a href="https://testdriven.io/blog/pytest-for-beginners/" target="_blank">Pytest for Beginners</a></html>
 +    * <html><a href="https://realpython.com/python-assert-statement/" target="_blank">Python's assert: Debug and Test Your Code Like a Pro</a></html>
 +    * <html><a href="https://realpython.com/python-testing/" target="_blank">Getting Started With Testing in Python</a></html>
 +    * <html><a href="https://realpython.com/learning-paths/test-your-python-apps/" target="_blank">Test Your Python Apps</a></html>
 +    * <html><a href="https://ward.readthedocs.io/en/latest/" target="_blank">ward : un framework de test pour Python</a></html>
 +    * <html><a href="https://snyk.io/blog/the-dangers-of-assert-in-python/?utm_campaign=AOM-2022&utm_medium=Paid-Email&utm_source=PyCoders&utm_content=the-dangers-of-assert-in-python" target="_blank">The dangers of assert in Python</a></html>