Перезапуск цикла 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