You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50P作业代码问题:循环或错误处理是否存在异常?

问题分析:CS50P作业日期格式化代码的循环与错误处理问题

先贴出你提供的代码:

months = [
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December",
]

while True:
    try:
        date = input("Date: ")
        if "/" in date:
            month, day, year = date.split("/")
        elif "," in date:
            monthday, year = date.split(",")
            month, day = monthday.split(" ")
            month = months.index(month) + 1
        if 0 > int(day) <= 31 or 0 > int(month) < 12:
            raise ValueError()
    except (ValueError, NameError, KeyError):
        pass
    else:
        print(f"{year}-{int(month):02}-{int(day):02}")
        break

代码存在的核心问题:

  • 日期/月份校验逻辑完全错误
    原判断0 > int(day) <= 31 or 0 > int(month) < 12逻辑混乱:

    • 日期的非法条件应为int(day) < 1 or int(day) > 31(日期必须在1-31之间)
    • 月份的非法条件应为int(month) < 1 or int(month) > 12(月份必须在1-12之间)
      原写法中0 > int(day) <=31等价于(0 > day) and (day <=31),只有负数日期才会触发错误,完全漏掉了日期大于31的情况;月份判断同理,根本起不到校验作用。
  • 未覆盖所有输入格式场景
    如果用户输入既不含/也不含,(比如January 1 2023),month、day、year变量都不会被赋值,后续执行int(day)会抛出NameError。应该在分支末尾添加else分支,直接抛出ValueError处理这种非法格式。

  • 英文月份拆分逻辑有漏洞
    使用monthday.split(" ")只能按单个空格分割,若输入日期前后有多余空格(比如 January 1, 2023),会导致解包元素数量不匹配,抛出ValueError。改用split()(不带参数)可自动分割任意数量的空白字符。

  • 错误处理过于宽泛
    代码中捕获的KeyError根本不会触发(没有字典操作),可以移除;NameError可通过完善分支逻辑避免,无需单独捕获。

修正后的代码示例:

months = [
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December",
]

while True:
    try:
        date = input("Date: ").strip()
        if "/" in date:
            month, day, year = date.split("/")
        elif "," in date:
            monthday_part, year = date.split(",")
            month, day = monthday_part.strip().split()
            month = months.index(month) + 1
        else:
            # 处理既不含/也不含,的非法格式
            raise ValueError()
        
        # 转换为整数并校验范围
        day_int = int(day)
        month_int = int(month)
        if day_int < 1 or day_int > 31 or month_int < 1 or month_int > 12:
            raise ValueError()
        
    except ValueError:
        pass
    else:
        print(f"{year}-{month_int:02}-{day_int:02}")
        break

内容的提问来源于stack exchange,提问作者971munir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 02:55:33