17

我在 Python 3.3 中有一个 try-except 块,我希望它无限期地运行。

try:
    imp = int(input("Importance:\n\t1: High\n\t2: Normal\n\t3: Low"))
except ValueError:
    imp = int(input("Please enter a number between 1 and 3:\n> ")

目前,如果用户输入一个非整数,它会按计划工作,但是如果他们再次输入它,它只会再次引发 ValueError 并崩溃。

解决此问题的最佳方法是什么?

4

2 回答 2

36

把它放在一个 while 循环中,当你得到你期望的输入时就中断。最好保持所有代码都依赖于imp下面的代码try,或者为它设置一个默认值以防止NameError' 进一步下降。

while True:
  try:
    imp = int(input("Importance:\n\t1: High\n\t2: Normal\n\t3: Low"))

    # ... Do stuff dependant on "imp"

    break # Only triggered if input is valid...
  except ValueError:
    print("Error: Invalid number")

编辑:user2678074 指出这可能会使调试变得困难,因为它可能会陷入无限循环。

我会提出两个建议来解决这个问题 - 首先使用具有定义重试次数的 for 循环。其次,将上述内容放在一个函数中,使其与应用程序逻辑的其余部分分开,并将错误隔离在该函数的范围内:

def safeIntegerInput( num_retries = 3 ):
    for attempt_no in range(num_retries):
        try:
            return int(input("Importance:\n\t1: High\n\t2: Normal\n\t3: Low"))
        except ValueError as error:
            if attempt_no < (num_retries - 1):
                print("Error: Invalid number")
            else:
                raise error

有了这个,你可以在函数调用之外有一个 try/except ,只有当你超过最大重试次数时它才会通过。

于 2013-03-05T19:30:12.520 回答
8
prompt = "Importance:\n\t1: High\n\t2: Normal\n\t3: Low\n> "
while True:
    try:
        imp = int(input(prompt))
        if imp < 1 or imp > 3:
            raise ValueError
        break
    except ValueError:
        prompt = "Please enter a number between 1 and 3:\n> "

输出:

rob@rivertam:~$ python3 test.py 
Importance:
    1: High
    2: Normal
    3: Low
> 67
Please enter a number between 1 and 3:
> test
Please enter a number between 1 and 3:
> 1
rob@rivertam:~$
于 2013-03-05T19:37:20.967 回答