Partage
  • Partager sur Facebook
  • Partager sur Twitter

la commande try / except qui ne fonctionne pas

Sujet résolu
    30 novembre 2011 à 20:56:57

    bonjour,

    Je commence le tutoriel de ce site.je suis rendu au deuxieme tp (celui de Zcasino),le premier tp ne ma pas trop poser de probleme mais la ca planche.ce n'est pas trop le fonctionnement du programme qui me pose probleme mais la fonction try/except.J'ai beau declarer la commande et la declaration des erreurs mais rien ne marche.Les erreurs ne sont pas prise en compte.

    Sauriez vous determiner mes erreurs

    #!/usr/bin/python2.7
    # -*- coding:utf-8 -*
    from math import ceil
    from random import randrange
    capital=0
    mise=0
    numero=0
    couleur=0
    print("quel est votre capital de jeu? :")
    capital=input()
    try:
            capital=int(capital)
            capital>=0
    except NameError:
            print("pas de chaine de caractere!!! vous devez entrer un nombre")
    except ValueError:
            print("un capita negatif est impossible")
    else:
            print("quel mise voulez mettre")
    


    voila je vous fais grace du reste du code car le test des premiere erreur ne fonctionne pas.

    ps:j'ai voulu tester ce code dans le mode interactif de python mais impossible,des que l'on rentre la fonction variable=input(),il attend une valeur et donc le reste du test try/except ne fonctionne pas.AUriez vous une astuce pour cela aussi.

    merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      30 novembre 2011 à 21:17:26

      T'es en version 2.x ou 3.x faut savoir?

      #!/usr/bin/python2.7
      


      T'es en version 2.7

      print("un capita negatif est impossible")
      


      T'es en version 3.x

      Les 2 versions ne sont pas compatibles, donc dis nous laquelle des 2 tu utilises
      • Partager sur Facebook
      • Partager sur Twitter
        30 novembre 2011 à 21:21:06

        J'avoue avoir eu du mal à suivre le tuto sur les exception, mais je peux t'aider sur certains point:

        try:
                capital>=0
        except ValueError:
                print("un capita negatif est impossible")
        

        Ton code n'as pas a lever cette erreur si on entre une mise négative
        La ligne "capital>=0" retournera, soit la valeur True, soit la valeur False, mais en aucun cas une erreur.
        En revanche, si on entre une chaine de caractère, ce sera une erreur "ValueError" qui sera retournée, utilise donc cette ligne dans cette circonstance.
        (Regarde bien ta fenêtre quand tu rentre une chaine de caractère: tu devrait apercevoir ta phrase "un capita negatif est impossible" juste avant ta fermeture)

        Je n'a pas utilisé d'exception d'erreur* pour ce TP, je te conseille de rajouter en fin de ce code un truc dans le genre:
        *Edit, merci nyko77 ;)
        if capital>=0:
            raise "type d'erreur"
        

        Après comme je te l'ai dit, on est pas obligé d'utiliser les erreurs, tu peut mettre le code que tu veux la dedans.
        Personnellement je n'ai pas vu l'intérêt d'utiliser les erreurs la dedans...
        • Partager sur Facebook
        • Partager sur Twitter
        Y s'taient cachés les steaks hachés.
        Anonyme
          30 novembre 2011 à 21:32:00

          Citation

          En revanche, si on entre une chaine de caractère, ce sera une erreur "ValueError" qui sera retournée, utilise donc cette ligne dans cette circonstance.



          Je pense plus à TypeError

          Et en python 2.x ça renvoie toujours True

          Citation

          Personnellement je n'ai pas vu l'intérêt d'utiliser les erreurs la dedans...



          +1
          • Partager sur Facebook
          • Partager sur Twitter
            30 novembre 2011 à 21:37:30

            Bonjour,
            Personnellement j'utiliserai tout de même une exception pour vérifier la valeur du input. Ensuite comme le dit Estecka, ton capital>=0 ne sert à rien. Ce ne serait pas plutôt capital<=0 d'ailleurs?

            #!/usr/bin/python2.7
            # -*- coding:utf-8 -*
            
            try:
            	capital=input("quel est votre capital de jeu? :")
            except NameError:
            	print("pas de chaine de caractere!!! vous devez entrer un nombre")
            else:
            	capital = int(capital)
            	if capital <= 0:
            		print("un capital negatif ou nul est impossible")
            	else:
            		print("quel mise voulez mettre")
            


            ps: je crois que l'utilisation du print(...) est possible depuis la version 2.6
            • Partager sur Facebook
            • Partager sur Twitter
              30 novembre 2011 à 21:42:45

              Citation : fred1599

              Citation

              En revanche, si on entre une chaine de caractère, ce sera une erreur "ValueError" qui sera retournée, utilise donc cette ligne dans cette circonstance.



              Je pense plus à TypeError



              Moi je sais pas, j'ai dit ça après expérience:
              J'ai lancé son programme, j'ai misé "ggg", et juste avant que la fenêtre ne disparaisse, j'ai vu s'afficher le texte qu'il voulait afficher en cas de ValueError

              Citation

              Personnellement j'utiliserai tout de même une exception pour vérifier la valeur du input.


              Euh... oui! >__<
              Je sais plus ce que j'ai écrit plus haut, j'ai du bien n’embrouiller...

              J'avais bel-et-bien utilisé les exceptions, mais pas les erreurs.
              • Partager sur Facebook
              • Partager sur Twitter
              Y s'taient cachés les steaks hachés.
                30 novembre 2011 à 21:47:52

                Remarque après réflexion, ça doit être possible sans exception. Un truck du genre:

                #!/usr/bin/python2.7
                # -*- coding:utf-8 -*
                
                capital=raw_input("quel est votre capital de jeu? :")
                
                if capital.isdigit():
                	print("quel mise voulez mettre")
                else:
                	print("Vous devez entrer un nombre positif")
                


                Par contre ça ne marche pas si capital == 0. Faut juste modifier le if:

                if capital.isdigit() and int(capital):
                
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  30 novembre 2011 à 22:00:12

                  Pourquoi pas tester?

                  >>> "ggg" >= 0
                  Traceback (most recent call last):
                    File "<stdin>", line 1, in <module>
                  TypeError: unorderable types: str() >= int()
                  


                  try:
                      n = int(input("Entre une valeur :"))
                      if n >= 0:
                          # suite traitement
                      except TypeError:
                          pass
                  


                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    30 novembre 2011 à 22:09:36

                    @fred1599: Non !
                    Traceback (most recent call last):
                      File "<pyshell#0>", line 1, in <module>
                        int("blabla")
                    ValueError: invalid literal for int() with base 10: 'blabla'
                    




                    La clé du problème c'est le raise, clairement. Et accessoirement le fait que pour savoir si le capital entré est négatif il faut forcément passer par une condition...

                    # [...]
                    try:
                        n = int(input())
                        if n < 0:
                            raise ValueError
                    except ValueError:
                        # Erreur : L'entrée doit être un nombre entier positif !
                    # [...]
                    


                    PS : Avec Python 2 il faut utiliser raw_input(...) à la place de input(...).
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      30 novembre 2011 à 22:17:00

                      Oui PsycoPy tu as raison c'est le code

                      try:
                              capital>=0
                      except ValueError:
                              print("un capita negatif est impossible")
                      


                      qui m'a induit en erreur et la phrase

                      Citation

                      En revanche, si on entre une chaine de caractère, ce sera une erreur "ValueError" qui sera retournée, utilise donc cette ligne dans cette circonstance.



                      Du coup je me suis écarté du contexte de départ où l'on transformait une chaîne en entier et j'ai fais un mix des deux :-°

                      • Partager sur Facebook
                      • Partager sur Twitter
                        1 décembre 2011 à 6:35:10

                        merci de votre soutien.Comme il est indique sur mon script je suis en vers 2.7 avec un petit nunux donc comme le disait certains je n'ai pas de fenêtre et tout s’exécute dans bash.
                        Au niveau du tp certes je peut faire sans les exceptions mais j'avoue que je veut essayer (ça met du piment en plus)et ça évite que le prog bug si on rentre soit un nombre négatif ou une chaîne de caractère.

                        a la lecture de vos com j'ai l'impression qu'il y a des fautes de code.Je vois que certains mettent le input() après le try.chez moi ça ne fonctionne pas du tout.je passe tout de suite en erreur.
                        psycopy a spécifier que input() ne fonctionnait pas en version 2. mais c'est ce qu'il utilise sur le tuto et il sont en 2.6

                        Citation

                        J'avais bel-et-bien utilisé les exceptions, mais pas les erreurs.



                        quel la différence entre les deux.je pensais qu'avec la chaîne try/except c'etait pour gérer les exceptions et donc forcement les erreurs
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          1 décembre 2011 à 8:48:21

                          Citation

                          psycopy a spécifier que input() ne fonctionnait pas en version 2. mais c'est ce qu'il utilise sur le tuto et il sont en 2.6



                          Non le tutoriel utilise la version 3.x

                          Pour la version 2.x, on utilise raw_input() au lieu d'input()

                          Dans ton cas, on peut utiliser ce code

                          try:
                              n = int(raw_input("Entrer la valeur:"))
                          except ValueError:
                              raise ValueError, "Erreur, entrer un nombre"
                          
                          • Partager sur Facebook
                          • Partager sur Twitter
                            1 décembre 2011 à 11:50:45

                            Citation : superguerrier


                            Citation

                            J'avais bel-et-bien utilisé les exceptions, mais pas les erreurs.



                            quel la différence entre les deux.je pensais qu'avec la chaîne try/except c'etait pour gérer les exceptions et donc forcement les erreurs



                            C'est bien ça : on parle bien de gérer les exceptions, et les exceptions sont le mécanisme de gestion des erreurs de Python : une exception non attrapée est la seule façon dont un programme Python peut planter avec un message d'erreur. En gros, il n'y a pas à faire de distinction entre exception et erreur.

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Zeste de Savoir, le site qui en a dans le citron !
                              1 décembre 2011 à 18:26:18

                              merci une nouvelle fois pour votre soutien!
                              Je suis donc passé a la version 3.2,ca va être mieux pour suivre le tuto et par conséquent votre aide.
                              J'ai donc suivi vos conseil et je suis parti sur des conditions.Voila ce que ca donne:

                              print("quel est votre capital de jeu? :")
                              while True:
                                      try:
                                              capital=input()
                                              capital=int(capital)
                              
                                              if capital<0 or capital>100:
                                                      raise ValueError
                                      except NameError:
                                              print("pas de chaine de caractere!!! vous devez entrer un nombre")
                                      except ValueError:
                                              print("le capital n'est pas bon!!! La valeur par default sera de 100$")
                                              capital=100
                                      else:
                                              print("quel mise voulez mettre")
                              


                              J'ai voulu faire un test sur la chaine de caractere,mais je ne sais pas comment proceder de telle maniere qu'elle tombe sur l'erreur.J'ai chercher dans les modules,mais j'avoue ne pas trop avoir l'habitude de ça.je ne sais pas trop ou chercher ni quel module prendre.avez vous des astuce pour m'aider a progresser.

                              pour le test je pensait faire comme cela

                              #commande 
                              
                              try:
                                     if capital="chaine de caractere"
                                     raise NameError
                              except NameError:
                                     print("message d'erreur sur la chaine")
                              
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                1 décembre 2011 à 18:41:50

                                Une petite explication s'impose.

                                Avec Python 2, input(...) sert à évaluer une entrée comme s'il s'agissait d'une instruction Python.

                                >>> x = input("@>")
                                @>123
                                >>> print(x)
                                123
                                >>> type(x)
                                <class "int">
                                


                                Alors qu'avec Python 3, input(...) permet de récupérer une entrée uniquement sous la forme d'une chaîne de caractères (équivalent du raw_input de Python 2).

                                >>> x = input("@>")
                                @>123
                                >>> print(x)
                                123
                                >>> type(x)
                                <class "str">
                                >>> x
                                "123"
                                



                                Enfin, tout cela pour dire que tu n'auras plus de NameError en utilisant le input de Python 3 puisqu'il n'est plus question d"évaluer l'entrée mais simplement de la récupérer dans une chaîne (que tu devras convertir en int en l’occurrence).
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  1 décembre 2011 à 19:19:23

                                  j'ai bien suivi ton conseil et j'ai modifié en conséquence.

                                  while True:
                                          try:
                                                  capital=input()
                                                  capital=int(capital)
                                                  if capital<=0 or capital>100:
                                                          raise ValueError
                                  
                                          except ValueError:
                                                  print("le capital n'est pas bon!!! par defaut votre capital est de 100$")
                                                  capital=100
                                                  continue
                                  


                                  C'est comme meme dingue je n'est rien dans mon code et je suis en erreur indetation.Y a t'il quelque chose qui vous choque.C'est dingue de lutter a ce point la avec une simple redirection d'erreur
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Anonyme
                                    1 décembre 2011 à 19:33:18

                                    Tu as sûrement mélangé des espaces avec des tabulations. Il faut choisir mais tu ne peux pas mélanger les deux. La PEP8 conseille plutôt l'indentation avec 4 espaces par niveau.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      1 décembre 2011 à 19:46:45

                                      tu avais raison au niveau de l'indentation c'etait bien un problème d'espace.par contre je doit forcement avoir une erreur de code.
                                      Le soft se lance sans problème,donc il me demande une valeur et dans tous les cas peut importe la valeur que je rentre (str ou int)je tombe sur le meme print et je n'arrive a acceder au deuxieme print.un peu comme si la fonction else ne jouait pas son role
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      la commande try / except qui ne fonctionne pas

                                      × 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