Как использовать команду try-exc в цикле while, запрашивая ввод пользователя - PullRequest
0 голосов
/ 31 марта 2019

Я новичок в Python и впервые попробовал использовать try и except. Я спрашиваю пользователя о целочисленном значении, но вместо завершения программы, если пользователь вводит, например, строку, я хотел бы спрашивать пользователя снова и снова, пока не будет задано целое число.

В данный момент пользователю предлагается только один раз дать другой ответ, если он дает строку, но если он снова вводит неправильный ввод, программа останавливается.

Ниже приведен пример того, что я имею в виду.

Я просматривал похожие вопросы по Stackoverflow, но не смог исправить ни одно из предложений.

travel_score = 0

while True:
    try:
        travel_score = int(input("How many times per year do you travel? Please give an integer number"))
    except ValueError:
        travel_score = int(input("This was not a valid input please try again"))


print ("User travels per year:", travel_score)

Ответы [ 3 ]

0 голосов
/ 31 марта 2019

Проблема в том, что для вашего второго ввода нет обработки исключений.

travel_score = 0

while True:
    try:
        travel_score = int(input("How many times per year do you travel? Please give an integer number"))
    except ValueError:
        # if an exception raised here it propagates
        travel_score = int(input("This was not a valid input please try again"))


print ("User travels per year:", travel_score)

Лучший способ справиться с этим - отправить пользователю информативное сообщение, если его ввод неверен, и разрешитьцикл, чтобы вернуться в начало и повторить запрос таким образом:

# there is no need to instantiate the travel_score variable
while True:
    try:
        travel_score = int(input("How many times per year do you travel? Please give an integer number"))
    except ValueError:
        print("This was not a valid input please try again")
    else:
        break  # <-- if the user inputs a valid score, this will break the input loop

print ("User travels per year:", travel_score)
0 голосов
/ 31 марта 2019

@ Лука Безеррас ответ хороший, но вы можете сделать его немного более компактным:

travel_score = input("How many times per year do you travel? Please give an integer number: ")

while type(travel_score) is not int:    
    try:
        travel_score = int(travel_score)
    except ValueError:
        travel_score = input("This was not a valid input please try again: ")


print ("User travels per year:", travel_score)
0 голосов
/ 31 марта 2019

Проблема в том, что после того, как вы сгенерировали исключение ValueError, оно перехватывается в блоке except, но затем, если оно будет сгенерировано снова, except s больше не будет ловить эти новые ошибки.Решение состоит в том, чтобы преобразовать ответ только в блоке try, а не сразу после ввода пользовательского ввода.

Попробуйте это:

travel_score = 0
is_int = False
answer = input("How many times per year do you travel? Please give an integer number: ")

while not is_int:    
    try:
        answer = int(answer)
        is_int = True
        travel_score = answer
    except ValueError:
        answer = input("This was not a valid input please try again: ")


print ("User travels per year:", travel_score)
...