【问题标题】:Catching specific error messages in try / except在 try / except 中捕获特定的错误消息
【发布时间】:2018-04-27 22:27:51
【问题描述】:

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

【问题讨论】:

标签: python python-3.x datetime if-statement try-except


【解决方案1】:

你很亲密。诀窍是使用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)))

【讨论】:

  • 与消息字符串进行比较是一种公认​​的做法吗?它们定义明确吗? datetime.date 的文档只说引发了 ValueError
  • 好问题。无论它是否“接受”都是意见。据我所知,这是 only 的方式。就“定义明确”而言,datetime 是标准库的一部分。当您更改 Python 版本时,您可能会看到不同的错误消息,并且它们将来可能会更改。如果这很重要,那么一个简单的解决方法是根据相同的标准自己提出异常(对于这个特定问题很容易)。
  • 该死的,我不知道我离答案这么近。试图把 e 放在前面但没有串起来。非常感谢你的提示,它真的帮助了我。我正要尝试找到有关回溯的东西并使它们等于但我无法弄清楚。 Thx 很多朋友。我实际上使用了 if 语句,因为我想知道程序是否可以找到多个超出范围的数字,或者它是否会在找到第一个数字时停止
  • @SnitchingAuggie,当您捕获错误时,您将无法使用相同的代码捕获后续错误。如果这有帮助,请随时接受(左侧的绿色勾号)。
  • 我不认为这是问题所在。发生异常时,只有一个异常向下游提供给e。您必须解决该问题(例如,将年份超出范围移动到范围内)并再次运行代码以查看是否还有更多错误。
【解决方案2】:

使用dict让你可以更轻松地添加

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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 2012-07-08
    • 2023-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 2010-12-05
    相关资源
    最近更新 更多