Saisir une note et rattraper les erreurs de saisie

Résolu
Robin -  
 Robin -

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

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
     

    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
  2. jee pee Messages postés 9441 Date d'inscription   Statut Modérateur Dernière intervention   9 981
     

    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
  3. Robin
     

    Merci beaucoup pour tous vos conseils

    0