如何重复try-except块

22 投票
2 回答
38432 浏览
提问于 2025-04-17 18:02

我在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错误并崩溃。

有什么好的方法来解决这个问题吗?

2 个回答

9
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:~$
39

把它放在一个循环里,当你得到预期的输入时就跳出循环。最好把所有依赖于 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 提出了一个有效的观点,这样可能会让调试变得困难,因为它可能会陷入无限循环。

我有两个建议来解决这个问题 - 首先,使用一个有固定重试次数的循环。其次,把上面的代码放在一个函数里,这样它就和你应用的其他逻辑分开了,错误也只会在这个函数的范围内出现:

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,这样只有在超过最大重试次数时才会抛出错误。

撰写回答