在 try / except 中捕获特定的错误消息
Catching specific error messages in try / except
我是 python 的新手,我即将制作这个会问你生日的新程序。我制作了一些 try/except 子句以避免人们在字符串中输入信息或输入大数字。我希望我的程序能够确定输入的信息最后是否等于日期。如果是,我希望将其打印出来,如果不是,我希望它找出用户输入的哪一部分是错误的。因此,我在最后一个 except 子句中添加了一些 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)))
你很接近。诀窍是使用 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)))
使用字典,添加更方便
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)])
产出
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]
我是 python 的新手,我即将制作这个会问你生日的新程序。我制作了一些 try/except 子句以避免人们在字符串中输入信息或输入大数字。我希望我的程序能够确定输入的信息最后是否等于日期。如果是,我希望将其打印出来,如果不是,我希望它找出用户输入的哪一部分是错误的。因此,我在最后一个 except 子句中添加了一些 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)))
你很接近。诀窍是使用 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)))
使用字典,添加更方便
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)])
产出
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]