Saisir une note et rattraper les erreurs de saisie

Résolu/Fermé
Robin - Modifié le 18 juil. 2022 à 14:37
 Robin - 21 juil. 2022 à 14:21

Bonjour,

Voici un code que j'ai commencé (seulement je ne comprends pas pourquoi il ne marche pas)

En effet, le but du programme est que l'utilisateur rentre sa note d'oral (pour pouvoir faire des calculs plus tard), seulement, je souhaite que si la donnée saisie par l'utilisateur est une chaîne ou une note au dessus de 20 ou en dessous de 0, cela lui mette " Erreur, veuillez recommencer" jusqu'à ce qu'il saisisse un nombre entre 1 et 20.

Merci d'avance 


Android / Chrome 103.0.0.0

3 réponses

mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 7 749
Modifié le 18 juil. 2022 à 14:36

Bonjour,

Comme soulignés par les messages de jee pee et Whismeril merci de copier coller ton code et de le mettre en forme avec des balises de code, c'est plus pratique pour tout le monde et plus écologique.

Pour préciser la réponse de jee pee, un bloc try...except sert à rattraper des exceptions. Le bloc except est exécuté si une exception est rattrapée. Il existe différents types d'exception, et dans ton code, deux fonctions peuvent en lever :

  • input peut une exception KeyboardInterrupt si tu fais ctrl c
  • int peut lever une exception ValueError si tu saisis une valeur qui n'est pas un entier (nombre flottant, chaîne de caractère...)

Le bloc try doit envelopper du code susceptible de lever une exception (ce qui n'est pas ton cas), sans quoi le(s) bloc(s) except correspont(s) n'ont aucune chance d'être traversé(s).

Un bloc try...except peut comporter plusieurs bloc try...except pour réagir en fonction de l'exception qui a été levée.

  • Si une exception est levée, mais qu'elle n'est pas rattrapée, alors le programme s'interrompt et python affiche l'exception qui a été levée (et depuis où).
  • Si dans le bloc except, tu ne précises pas le type de l'exception rattrapée, alors ce bloc except les rattrape toutes. C'est généralement une mauvaise idée car il y certaines exceptions que tu ne veux surtout pas rattraper (en l'occurrence, rattraper un ctrl c est une mauvaise idée car cela empêcherait l'utilisateur d'interrompre facilement ton programme).

Voici à quoi pourrait ressembler ton code une fois corrigé :

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys

note = None
while note is None:
    try:
        note = int(input("Note (0-20) ? "))
        if not (0 <= note <= 20):
            raise RuntimeError("Note invalide (ce doit être un entier compris entre 0 et 20)")
    except ValueError:
        print(f"Vous devez saisir un entier !", file=sys.stderr)
    except RuntimeError as e:
        print(e, file=sys.stderr)
        note = None
    except KeyboardInterrupt:
        print("Au revoir !")
        sys.exit(1)
print(f"La note saisie est {note}")

Note que le bloc KeyboardInterrupt est mis là "pour le fun", pour démonter que ce genre d'exception peut se rattraper.

Résultat :

Note (0-20) ? -2
Note invalide (ce doit être un entier compris entre 0 et 20)
Note (0-20) ? 22
Note invalide (ce doit être un entier compris entre 0 et 20)
Note (0-20) ? 10.2
Vous devez saisir un entier !
Note (0-20) ? 3
La note saisie est 3

Bonne chance

1
jee pee Messages postés 39658 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 28 avril 2024 9 238
Modifié le 14 juil. 2022 à 19:33

Bonjour,

Si tu veux que le try teste la réponse chaine avec erreur il faut mettre l'input après le try.

Sur le forum, plutot qu'une image il est préférable de mettre le code avec le bouton code, à cote du bouton image.


0
Whismeril Messages postés 19031 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 28 avril 2024 931
14 juil. 2022 à 19:41

Bonjour 

ici un petit tuto sur la bonne façon de poster un code https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code

0

Merci beaucoup pour tous vos conseils

0