Получите инструкцию Try для циклического перемещения до получения правильного значения

Я пытаюсь заставить пользователя ввести число от 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

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

Ответ 1

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'

Ответ 2

Современные исключения на 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 или что-то в этом роде.

Ответ 3

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

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

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

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 guaranteed to be correct.

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

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

Ответ 5

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

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

Ответ 6

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)