【问题标题】:How to use try-except in Python function return boolean?如何在 Python 函数中使用 try-except 返回布尔值?
【发布时间】:2020-11-10 10:23:15
【问题描述】:

我需要使用 try-except 来验证日期和时间的输入字符串。输入格式应该是 MM/DD/YYYY HH:MM:SS。如果 validate 函数返回 false,则它无效。我尝试了无效输入,但 try-except 没有按预期工作。未打印错误消息。我的代码有什么问题?如何解决?谢谢。

def validate_user_input(input_string):
    # check the input validation

    validation = True
    if input_string[2] != "/" or input_string[5] != "/":
        validation = False
    elif int(date) > 31 or int(date) < 1:
        validation = False
    elif int(month) > 12 or int(month) < 1:
        validation = False
    elif int(hour) < 0 or int(hour) > 24:
        validation = False
    elif int(minute) < 0 or int(minute) > 59:
        validation = False
    elif int(second) < 0 or int(second) > 59:
        validation = False
    return validation


input = input("Please input a date and time within the format of MM/DD/YYYY HH:MM:SS")
# get the information from the input

year = input[6:10]
month = input[0:2]
date = input[3:5]
hour = input[11:13]
minute = input[14:16]
second = input[17:19]

# try-except
try:
    validate_user_input(input) == False
    print("Your input is valid!")
except:
    print("Error: the input date and time is invalid!")

【问题讨论】:

  • 附带说明,您的代码将拒绝完全有效的日期和时间“12/31/2005 23:59:60”(leap second),以及其他时区的等价物。
  • 为什么你认为应该在你的 try 块中抛出错误?

标签: python function boolean try-except


【解决方案1】:

except 只会在一个异常被抛出并且未被早期的try-except 捕获的情况下捕获一个异常。你的代码中没有 raiseing 任何东西,所以 except 块永远不会运行。当validate_user_input 函数返回False 时,您应该抛出一个错误,可能是ValueError

try:
    if not validate_user_input(input):
        raise ValueError("Bad input")
except:
    ...

【讨论】:

  • 太棒了!它按预期工作。太感谢了。我刚刚学会了这个尝试除外的东西。你的回答真的很有帮助。
【解决方案2】:

改为使用 if 语句。这应该比使用 try 和 except 更简单。

if validate_user_input(input) == False:
    print("Your input is valid!")
else:
    print("Error: the input date and time is invalid!")

【讨论】:

  • 另一种方法是更改​​validate_user_input 函数以引发无效输入异常,否则不返回任何内容。这也可以让您解释输入是如何无效的,无论是标点符号还是无效的月份数。
  • 错误信息是帮助信息;他们应该帮助用户完成他们的任务。
  • If-else 也可以,但我的作业需要 try-except。不过谢谢。
【解决方案3】:
# try-except
try: 
    validate_user_input(input) == False
    print("Your input is valid!")
except:
    print("Error: the input date and time is invalid!")

您似乎要从输入中验证输入的日期和时间。但是这个代码行没有做任何事情。它检查条件而不做任何事情,@dogman288 回答让它发生。我想建议一个图书馆电话python-dateutil。只需几行,您就可以非常轻松地进行验证,我希望这会节省您的时间。只需评论相关输出即可。

from dateutil.parser import parse
from dateutil.parser._parser import ParserError


def validate_user_input(input_string: str):
    try:
        parse(input_string)
        print("Your input is valid!")
    except ParserError as error:
        print(error)


validate_user_input("12/31/2005 23:59:6")  # Your input is valid!
validate_user_input("13/31/2005 23:59:6")  # month must be in 1..12: 13/31/2005 23:59:6
validate_user_input("12/32/2005 23:59:6")  # day is out of range for month: 12/32/2005 23:59:6
validate_user_input("12/31/200511111 23:59:6")  # year 200511111 is out of range: 12/31/200511111 23:59:6
validate_user_input("12/31/2005 24:59:6")  # hour must be in 0..23: 12/31/2005 24:59:6
validate_user_input("12/31/2005 23:61:6")  # minute must be in 0..59: 12/31/2005 23:61:6
validate_user_input("12/31/2005 23:59:61")  # second must be in 0..59: 12/31/2005 23:59:61
validate_user_input("")  # String does not contain a date: 
validate_user_input("some_string")  # Unknown string format: some_string

【讨论】:

  • 非常感谢。你的回答很有帮助。很高兴学习新知识。
  • 不客气@Timon,如果您需要我的帮助,请在此处评论。
猜你喜欢
  • 2011-01-22
  • 2018-11-06
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多