Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lever une exception

Tutoriel officiel: raise ValueError

Sujet résolu
Anonyme
    9 mars 2011 à 10:10:28

    Bonjour amis zéros, depuis 4-5 jours je me suis mis au Python grâce au tutoriel de Prolixe et 6pri1, aucun problème pour la première partie, TP compris mais j'ai juste du mal à comprendre l'exemple donné pour lever une exception. Voici donc le code, je vous explique ce que je ne comprends pas juste après.

    annee = input() # l'utilisateur entre l'année
    try:
        annee = int(annee) # on tente de convertir l'année
        if annee<=0:
            raise ValueError("l'année entrée est négative ou nulle")
    except ValueError:
        print("La valeur entrée est invalide (l'année est peut-être négative).")
    
    if (annee % 4 == 0 and annee % 100 is not 0) or annee % 400 == 0:
        print("Année bissextile")
    else:
        print("Année non bissextile")
    


    Donc, selon ce que j'ai pu comprendre, si l'année entrée par l'utilisateur est négative ou nulle, ce code devrait afficher "l'année entrée est négative ou nulle" mais il affiche l'autre message, à savoir "La valeur entrée est invalide (l'année est peut-être négative)."
    J'ai bien compris que grâce au if annee <= 0: une exception de type ValueError doit être levée dans ce cas, mais je ne comprends pas pourquoi le message affiché après raise ValueError n'apparaît pas.

    Merci d'avance à ceux qui pourront m'éclairer. :)
    • Partager sur Facebook
    • Partager sur Twitter
      9 mars 2011 à 11:27:27

      Tu prends le problème dans le mauvais sens.

      raise permet juste de levé une exception, le paramètre représente la même chose que le paramètre d'une fonction. Tu peux le réutiliser ou non.

      C'est le except qui définit l'action à faire en cas de raise de l'exception. Dans le except, tu peux réutiliser le paramètre renseigner dans le raise, mais tel que ton code est fait, ça ne le fait pas.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        9 mars 2011 à 12:09:48

        L'erreur vient bien du tuto. Leur exemple est faut.

        while True:
            try:
                n = int(input('année : '))
                if n < 1:
                    raise ValueError('Le nombre saisi doit être positif !')
            except ValueError as err:
                print(err, 'Réessayez...', sep='\n')
                continue
            break
        
        #<- la suite du code ici...
        


        Ainsi, tant que la saisie n'est pas correct on redemande l'année.
        err contient le message d'erreur; soit en français si le nombre n'est pas positif, soit en anglais si la convertion de la chaine saisie ne peut ce faire (si cette dernière contient d'autres caractères que des chiffres).


        Ce serai mieux ainsi :
        while True:
            try:
                n = int(input('année : '))
                if n < 1:
                    raise ValueError
            except ValueError:
                print("L'année n'est pas correct !", 'Réessayez...', sep='\n')
                continue
            break
        
        #<- la suite du code ici...
        

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          9 mars 2011 à 12:09:53

          Un exemple simple de l'utilisation de raise

          def test(n):
              from math import sqrt
              if n < 0:
                  raise ValueError("le nombre ne peut pas etre negatif") 
              else :
                  return sqrt(n)
                      
          
          print(test(45))
          print(test(-5))
          


          Dans le code ci-dessus, je lève une exception ValueError si n<0
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            9 mars 2011 à 12:34:28

            Ok, merci pour vos explications j'ai compris :)
            • Partager sur Facebook
            • Partager sur Twitter

            Lever une exception

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown