使用Try语句循环,直到获得正确的值。

25
我正在尝试让用户输入一个介于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

感谢任何帮助。

10
这是一个非常糟糕的设计;这里的用户输入错误实际上并不算异常情况。 - unwind
可能是重复的问题:如何在异常后重试? - Trilarion
7个回答

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

@jellybean -- 谢谢你。这个工作是最好的,所有其他答案都很好,但这段代码可以捕捉到用户输入任何其他不正确的变量。 - chrisg

6
现代Python的异常是类;通过使用raise 'incorrect',您正在使用一种被废弃的语言特性,称为字符串异常。Python教程中的Errors and Exceptions部分将是开始学习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)

附注:变量名 a 不好,你应该将其改为 chosen_option 或类似的名称。


4

您的方法似乎是一种非常冗长的方式来实现相当简单的事情:

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

你在同一个简单的代码块中既抛出又捕获异常,这并不是异常处理的真正意义。你可以通过跳出循环或保持条件来更好地处理异常。例如:

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

不必使用异常,你可以像这样做:

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

这是真的。不能直接使用。 - Anssi

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

0

我想检查输入是否为一个数字: 对我来说,我的项目中的工作解决方案是:


while True:
    number1 = input("Enter a number: ")
    try:
        n1 = int(number1)
        break
    except ValueError:
        print("It has to be a number!")

# then proceed with your code using this number


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接