Поймать конкретные сообщения об ошибках в try / кроме - PullRequest
0 голосов
/ 28 апреля 2018

Я новичок в python, и я собираюсь сделать эту новую программу, которая будет просить вас на ваш день рождения. Я сделал несколько попыток / исключений, чтобы люди не вводили информацию в виде строк или больших чисел. Я хотел бы, чтобы моя программа выяснила, соответствует ли введенная информация дате в конце. Если это произойдет, я бы хотел, чтобы он был напечатан, а если нет, я бы хотел узнать, какая часть ввода пользователя была неправильной. Поэтому я сделал несколько предложений if в последнем, кроме предложения, с мыслью, что ошибки будут равны сообщению.

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

Мой код выглядит так:

try: 
    print(datetime.date(int(birthYear), int(birthMonth), int(birthDay)))
except TypeError:
    if ValueError == "ValueError: month must be in 1..12": 
        print("Month " + str(birthMonth) + " is out of range. The month must be a number in 1...12")
    if ValueError == "ValueError: year " + str(birthYear) + " is out of range": 
        print("Year " + str(birthMonth) + " is out of range. The year must be a number in " + str(datetime.MINYEAR) + "..." + str(datetime.MAXYEAR))
    if ValueError == "ValueError: day is out of range for month": 
        print("Day " + str(birthDay) + " is out of range. The day must be a number in 1..." + str(calendar.monthrange(birthYear, birthMonth)))

Спасибо заранее

1 Ответ

0 голосов
/ 28 апреля 2018

Вы были близки. Хитрость заключается в том, чтобы использовать ValueError as e и сравнивать ваши строки с str(e). Также рекомендуется использовать if / elif вместо повторных if операторов.

Вот рабочий пример:

import calendar, datetime

try: 
    print(datetime.date(int(birthYear), int(birthMonth), int(birthDay)))
except ValueError as e:
    if str(e) == 'month must be in 1..12': 
        print('Month ' + str(birthMonth) + ' is out of range. The month must be a number in 1...12')
    elif str(e) == 'year {0} is out of range'.format(birthYear): 
        print('Year ' + str(birthMonth) + ' is out of range. The year must be a number in ' + str(datetime.MINYEAR) + '...' + str(datetime.MAXYEAR))
    elif str(e) == 'day is out of range for month': 
        print('Day ' + str(birthDay) + ' is out of range. The day must be a number in 1...' + str(calendar.monthrange(birthYear, birthMonth)))
...