web-dev-qa-db-fra.com

Obtenez une instruction Try à boucler jusqu'à ce que la valeur correcte soit obtenue

J'essaie d'amener un utilisateur à entrer un nombre compris entre 1 et 4. J'ai un code pour vérifier si le numéro est correct mais je veux que le code boucle plusieurs fois jusqu'à ce que les chiffres soient corrects. Est-ce que quelqu'un sait comment faire ça? Le code est ci-dessous:

def Release():


    try:
        print 'Please select one of the following?\nCompletion = 0\nRelease ID = 1\nVersion ID = 2\nBuild ID = 3\n'
        a = int(input("Please select the type of release required: "))
        if a == 0:
            files(a)
        Elif a == 1:
            files(a)
        Elif a == 2:
            files(a)
        Elif a == 3:
            files(a)
        else:
            raise 'incorrect'
    except 'incorrect':    
        print 'Try Again'
    except:
        print 'Error'

Release()

Je reçois également une erreur concernant l'exception que j'ai entrée:

kill.py:20: DeprecationWarning: catching of string exceptions is deprecated
  except 'incorrect':
Error

Merci pour toute aide

15
chrissygormley
def files(a):
    pass

while True:
    try:
        i = int(input('Select: '))
        if i in range(4):
            files(i)
            break
    except:    
        pass

    print '\nIncorrect input, try again'
39
Johannes Charra

Modern Python sont des classes; en utilisant raise 'incorrect', vous utilisez une fonction de langage obsolète appelée exceptions de chaîne. La section Erreurs et exceptions du didacticiel Python serait un bon point de départ pour la gestion des exceptions de base en Python.

En général, les exceptions ne sont de toute façon pas idéales pour votre situation - une simple boucle while devrait suffire. Des exceptions doivent être réservées pour des situations exceptionnelles, et une mauvaise entrée utilisateur n'est pas exceptionnelle, c'est normal.

La version en boucle de Release ressemblerait à ceci:

def Release():
    a = None
    while a not in (0, 1, 2, 3):
        print 'Please select one of the following?\nCompletion = 0\nRelease ID = 1\nVersion ID = 2\nBuild ID = 3\n'
        try:
            a = int(input("Please select the type of release required: "))
        except ValueError:
            pass  # Could happen in face of bad user input
    files(a)

P.S. a est un mauvais nom de variable; vous devriez probablement le changer en chosen_option ou quelque chose comme ça.

5
Hank Gay

Votre approche semble être un moyen très long pour accomplir quelque chose d'assez simple:

def Release() :
    while True :
        print 'Please select one of the following?\nCompletion = 0\nRelease ID = 1\nVersion ID = 2\nBuild ID = 3\n'
        a = int(input("Please select the type of release required: "))
        if 0 <= a < 4 :
            files(a)
            break
        else :
            print('Try Again')
4
sykora

Vous lancez et interceptez l'exception dans le même bloc de code simple - ce n'est pas vraiment de cela qu'il s'agit. Vous pouvez mieux le faire soit en sortant d'une boucle ou en gardant une condition. Par exemple.:

def isNumberCorrect(x):
   return x in range(4)

def Release():
    num = None # incorrect

    while not isNumberCorrect(num):
        print 'Please select one of the following?\nCompletion = 0\nRelease ID = 1\nVersion ID = 2\nBuild ID = 3\n'
        num_str = raw_input("Please select the type of release required: ")

        try:
            num = int(num_str)
        except ValueError:
            num = None

        if not isNumberCorrect(num):
            print 'Incorrect!'

     # work with num here; it's guaranteed to be correct.

if __name__ == '__main__':
  try:
    Release()
  except:
    print 'Error!'

EDIT: Ajout d'une vérification d'erreur dans l'analyse syntaxique int.

3
Max Shawabkeh

Au lieu d'utiliser des exceptions, vous pouvez faire quelque chose comme ceci:

...
a = raw_input("Please select the type of release required:")
while a not in ['0','1','2','3']: a = raw_input("Try again: ")
files(int(a))
...
2
Anssi
def Release():
    while 1:
        print """Please select one of the following?
                 Completion = 0
                 Release ID = 1
                 Version ID = 2
                 Build ID = 3
                 Exit = 4 """            
        try:
             a = int(raw_input("Please select the type of release required: "))
        except Exception,e:
             print e
        else:
             if a==4: return 0
             files(a)
1
ghostdog74