2015-07-16 4 views
1

У меня возникли проблемы с созданием этой программы ... Я хочу, чтобы я запрашивал ввод, если они дают строку или дату в неправильном формате ... это мой код для него и Я не знаю, почему он не работает. каждый раз, когда я запустить его и ввести строку, в первый раз, он будет говорить «Ой! Это не является допустимой датой. Попробуйте еще раз ...», если пользователь вводит неправильный ввод снова падаетУстранение неполадок и предотвращение сбоя


ЭТО МОЙ КОД.

while 1 == 1: 
    try: 
     birthday = raw_input("Enter your Birth date in MM/DD/YYYY format: ") 
     birth_date = datetime.strptime(birthday, '%m/%d/%Y') 

    except ValueError: 
     print "Oops! That was not a valid date. Try again..." 
     birthday = raw_input("Enter your Birth date in MM/DD/YYYY format: ") 
     birth_date = datetime.strptime(birthday, '%m/%d/%Y') 

    if (((datetime.today() - birth_date).days)/365.2425) > 110:   
     print "Sorry You are older than 110 year i cannot do that math." 

    elif ((datetime.today() - birth_date).days) < 0: 
     print "Sorry you entered a date in the furture." 

    elif ((datetime.today() - birth_date).days) == 0: 
     print "OMG You were just born, tomorrow you will be one day old." 
     else: 
     print "Age: %d days " % ((datetime.today() - birth_date).days) 

ЭТО ОШИБКА ПОЯВЛЕНИЯ:

birth_date = datetime.strptime(birthday, '%m/%d/%Y') 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 325, in _strptime 
    (data_string, format)) 
ValueError: time data 'ASFA' does not match format '%m/%d/%Y' 
logout 
+0

Что приводит к этому сообщению об ошибке? – kvorobiev

ответ

0

Ваш код отформатирован неправильно:

while True: 
    try: 
     birthday = raw_input("Enter your Birth date in MM/DD/YYYY format: ") 
     birth_date = datetime.strptime(birthday, '%m/%d/%Y') 
     break 
    except ValueError: 
     print "Oops! That was not a valid date. Try again..." 

if (((datetime.today() - birth_date).days)/365.2425) > 110:   
    print "Sorry You are older than 110 year i cannot do that math." 

elif ((datetime.today() - birth_date).days) < 0: 
    print "Sorry you entered a date in the furture." 

elif ((datetime.today() - birth_date).days) == 0: 
    print "OMG You were just born, tomorrow you will be one day old." 
else: 
    print "Age: %d days " % ((datetime.today() - birth_date).days) 

Ваша проблема скорее всего возникла потому, что вы пытались поставить некоторые более плохой вход в код внутри вашего except блок. Это исключение было бы необработанным. Вы не хотите просто «повторять попытку» внутри своего исключения. Вы хотите, чтобы пользователь дал понять, что не так, и вернуться к началу. Если они добавят еще более плохой ввод в это исключение, будет необработанным.

Я взял остальную часть кода из цикла while, потому что я предполагаю, что вы намереваетесь. Ваша программа просто бежит вечно другим. Если вы этого хотите, вам следует использовать ответ @ NightShadeQueen. Я делаю предположение, что вы просто хотите, чтобы часть обрабатывала исключение в цикле.

Чтобы это работает навсегда (по крайней мере до тех пор, пока пользователь не попадает Ctrl + с или определить другой способ выйти) обернуть его в другой while цикла:

while True: 
    while True: 
     try: 
      birthday = input("Enter your Birth date in MM/DD/YYYY format: ") 
      birth_date = datetime.strptime(birthday, '%m/%d/%Y') 
      break 
     except ValueError: 
      print("Oops! That was not a valid date. Try again...") 

    if (((datetime.today() - birth_date).days)/365.2425) > 110:   
     print("Sorry You are older than 110 year i cannot do that math.") 

    elif ((datetime.today() - birth_date).days) < 0: 
     print("Sorry you entered a date in the furture.") 

    elif ((datetime.today() - birth_date).days) == 0: 
     print("OMG You were just born, tomorrow you will be one day old.") 
    else: 
     print("Age: %d days " % ((datetime.today() - birth_date).days)) 

Хотя нечто большее как это, вероятно, будет предпочтительнее:

def age_finder(): 
    while True: 
     try: 
      birthday = input("Enter your Birth date in MM/DD/YYYY format: ") 
      birth_date = datetime.strptime(birthday, '%m/%d/%Y') 
      break 
     except ValueError: 
      print("Oops! That was not a valid date. Try again...") 

    if (((datetime.today() - birth_date).days)/365.2425) > 110:   
     print("Sorry You are older than 110 year i cannot do that math.") 

    elif ((datetime.today() - birth_date).days) < 0: 
     print("Sorry you entered a date in the furture.") 

    elif ((datetime.today() - birth_date).days) == 0: 
     print("OMG You were just born, tomorrow you will be one day old.") 
    else: 
     print("Age: %d days " % ((datetime.today() - birth_date).days)) 

if __name__ == '__main__': 
    try: 
     while True: 
      age_finder() 
    except KeyBoardInterrupt: 
     print() 
     print('Thanks for using my app') 
     exit() 

Это предотвращает форма пользователя показывается противный смотрит текст сообщения об ошибке, когда они попали ctrl + c.

+0

Спасибо, Ян, это просто решило его ... но у меня есть другой вопрос, если я хочу, чтобы он продолжал просить другую дату даже после того, как они вступили в действительную дату, я прошу чувства любопытства , вроде бы мне нужно иметь еще один цикл –

0

Ошибка возникает потому, что входные данные от raw_input «ASFA» действительно соответствуют формату время ожидаемой даты «% м /% г /% Y»,

Попробуйте ввести что-то наподобие «01/20/1999».

2

Ну, вам нечего ловить ошибки в вашем блоке, кроме блока. Вы, вероятно, хотите, чтобы: P

Try:

while True: #Don't need 1==1, while True works too! 
    try: 
     birthday = raw_input("Enter your Birth date in MM/DD/YYYY format: ") 
     birth_date = datetime.strptime(birthday, '%m/%d/%Y') 

    except ValueError: 
     print "Oops! That was not a valid date. Try again..." 
     #Because everything else is in an else block, now goes back 
     #to start of loop 
    else: 
     #only happens if no exceptions happen 
     if (((datetime.today() - birth_date).days)/365.2425) > 110:   
      print "Sorry You are older than 110 year i cannot do that math." 
     #rest of your elif tree goes here, etc, etc. 
     else: #I'm valid data! Finally! 
      break 
birth_date #do your calculations here, outside the loop? 
+0

См. [Здесь] (http://stackoverflow.com/questions/16138232/is-it-a-good-practice-to-use-try-except-else-in-python) для получения более подробной информации о try/except/else/finally структура python – NightShadeQueen

Смежные вопросы