简体   繁体   中英

Catching specific error messages in try / except

I am new to python and I am about to make this new program that will ask you for your birthday. I've made some try/except clauses to avoid people entering info in strings or to high numbers. I would like my program to find out if the info entered equals a date in the end. If it does I would like to have it printed and if not I would like it to find out what part of the user input was wrong. I have therefore made some if clauses in the last except clause with the idea that the errors would equal a message.

I would like to know if it is possible to make the program match the messages with the error to find out the specific error and figure out what part of the input was wrong.

My code looks like this:

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)))

You were close. The trick is to use ValueError as e and compare your strings against str(e) . It's also good practice to use if / elif rather than repeated if statements.

Here's a working example:

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)))

Using dict so that you can add more easily

import calendar, datetime

birthYear= int(input('Birth year:'))
birthMonth= int(input('Birth month:'))
birthDay= int(input('Birth day:'))

error_dict = {
    'month must be in 1..12' : f'Month {birthMonth} is out of range. The month must be a number in 1...12',
     'year {0} is out of range':f'Year {birthMonth} is out of range. The year must be a number in  {datetime.MINYEAR} ...{datetime.MAXYEAR}',
    'day is out of range for month' : f'Day  {birthDay} is out of range. The day must be a number in 1... 12'
}
    
try: 
    print(datetime.date((birthYear), (birthMonth), (birthDay)))    
    
except ValueError as e:
    print(error_dict[str(e)])

Outputs

Birth year:32
Birth month:32
Birth day:32
Month 32 is out of range. The month must be a number in 1...12

[Program finished]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM