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は、無限ループに陥る可能性があるため、デバッグが困難になる可能性があるという有効なポイントを示しています。

これを解決するために2つの提案をします。最初に、定義された再試行回数で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

これが適切な場所にあると、関数呼び出しの外部で試行/除外を行うことができ、再試行の最大数を超えた場合にのみ実行されます。

于 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 に答える