【问题标题】:How to repeat try-except block如何重复 try-except 块
【发布时间】:2013-02-20 08:46:19
【问题描述】:

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

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

【问题讨论】:

    标签: python exception-handling python-3.x


    【解决方案1】:

    把它放在一个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 ,只有当你超过最大重试次数时它才会通过。

    【讨论】:

    • 我建议不要使用 while 循环,而是使用定义了重新尝试的 for 循环。否则,您可能会导致很难调试的程序冻结。最好让程序在重试几次后以错误结束(在大多数情况下),因为回溯会告诉你它的工作不当。
    【解决方案2】:
    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:~$
    

    【讨论】:

      猜你喜欢
      • 2018-05-27
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2020-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多