Получить оператор Try для циклического обхода до получения правильного значения - PullRequest
13 голосов
/ 11 февраля 2010

Я пытаюсь заставить пользователя ввести число от 1 до 4. У меня есть код, чтобы проверить правильность номера, но я хочу, чтобы код повторялся несколько раз, пока числа не будут правильными. Кто-нибудь знает как это сделать? Код ниже:

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()

Я также получаю ошибку об исключении, которое я ввел:

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

Спасибо за любую помощь

Ответы [ 6 ]

36 голосов
/ 11 февраля 2010
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'
5 голосов
/ 11 февраля 2010

Современные Python исключения являются классами; используя raise 'incorrect', вы используете устаревшую языковую функцию, называемую строковыми исключениями. Раздел Ошибки и исключения в руководстве по Python будет хорошим началом для базовой обработки исключений в Python.

В общем, исключения в любом случае не идеальны для вашей ситуации - достаточно простого цикла while. Исключения должны быть зарезервированы для исключительных ситуаций, и неправильный пользовательский ввод не является исключительным, как ожидается.

Версия Release на основе цикла будет выглядеть примерно так:

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 неверное имя переменной; вам, вероятно, следует изменить его на chosen_option или что-то в этом роде.

4 голосов
/ 11 февраля 2010

Ваш подход кажется очень многословным способом достижения чего-то довольно простого:

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')
3 голосов
/ 11 февраля 2010

Вы оба бросаете и перехватываете исключение в одном и том же простом блоке кода - это не совсем то, что представляет собой обработка исключения. Вы можете сделать это лучше, либо вырвавшись из цикла, либо соблюдая условие. E.g.:

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!'

РЕДАКТИРОВАТЬ: Добавлена ​​проверка ошибок при разборе int.

2 голосов
/ 11 февраля 2010

Вместо использования исключений вы можете сделать что-то вроде этого:

...
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))
...
1 голос
/ 11 февраля 2010
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)
...