Перезапуск цикла Python, даже если есть попытка: кроме:

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

while 1:
    try:
        a = input("How old are you? ")
    except:
        print "Your answer must be a number!"
        continue

    years_100 = 100 - a
    years_100 = str(years_100)
    a = str(a)
    print "You said you were "+a+", so that means you still have "+years_100+" years"
    print "to go until you are 100!"
    break
while 2:
    try:
        b = str(raw_input('Do you want to do it again? If yes enter "yes", otherwise type "no" to stop the script.'))
    except:
        print 'Please try again. Enter "yes" to do it again, or "no" to stop.'
        continue

    if b == "yes":
            print 'You entered "yes". Script will now restart... '
    elif b == "no":
            print 'You entered "no". Script will now stop.' 
            break

Он отлично работает для цикла. Если вы введете что-то отличное от числа, вам сообщат, что разрешены только цифры.

Тем не менее, во 2-м цикле, он просит вас ввести да или нет, но если вы вводите что-то другое, он просто перезапускает цикл вместо печати сообщения после

except:

Что я сделал не так и как я могу это исправить, чтобы он отображал сообщение, которое я сказал?

1 ответ

Решение

Вы не получите исключение, потому что вы всегда вводите строку при использовании raw_input(), таким образом str() на возвращаемое значение raw_input() никогда не подведет.

Вместо этого добавьте else заявление к вашему yes или же no Тесты:

if b == "yes":
        print 'You entered "yes". Script will now restart... '
elif b == "no":
        print 'You entered "no". Script will now stop.' 
        break
else:
    print 'Please try again. Enter "yes" to do it again, or "no" to stop.'
    continue

Обратите внимание, что вы никогда не должны использовать одеяло except заявление; поймать конкретные исключения. В противном случае вы будете маскировать не связанные с этим проблемы, затрудняя их поиск.

Ваш первый кроме обработчик должен только поймать NameError, EOFError а также SyntaxError например:

try:
    a = input("How old are you? ")
except (NameError, SyntaxError, EOFError):
    print "Your answer must be a number!"
    continue

как вот что input() бросил бы.

Также обратите внимание, что input() принимает любое выражение Python. Если я войду "Hello program" (с кавычками), исключение не возникнет, но это тоже не число. использование int(raw_input()) вместо этого, а затем поймать ValueError (что будет выброшено, если вы введете что-нибудь, что не является целым числом) и EOFError за raw_input:

try:
    a = int(raw_input("How old are you? "))
except (ValueError, EOFError):
    print "Your answer must be a number!"
    continue

Чтобы использовать второй цикл для управления первым, сделайте его функцией, которая возвращает True или же False:

def yes_or_no():
    while True:
        try:
            cont = raw_input('Do you want to do it again? If yes enter "yes", otherwise type "no" to stop the script.'))
        except EOFError:
            cont = ''  # not yes and not no, so it'll loop again.
        cont = cont.strip().lower()  # remove whitespace and make it lowercase
        if cont == 'yes':
            print 'You entered "yes". Script will now restart... '
            return True
        if cont == 'no':
            print 'You entered "no". Script will now stop.' 
            return False
        print 'Please try again. Enter "yes" to do it again, or "no" to stop.'

а в другом цикле:

while True:
    # ask for a number, etc.

    if not yes_or_no():
        break  # False was returned from yes_or_no
    # True was returned, we continue the loop
Другие вопросы по тегам