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
相关产品推荐
相关产品推荐

