如何对双日期输入场景抛出自定义ValueError并引导用户重输
核心问题
原代码存在两处逻辑缺陷,导致无法捕获输入不完整的场景:
- 输入内容按逗号分割、解包赋值的逻辑未做异常处理,当用户输入内容不含逗号、分割后元素数量不等于2时,会直接触发Python原生解包错误,不会进入后续日期校验流程。
validate函数内的逐字符遍历为冗余逻辑,datetime.datetime.strptime本身在解析不符合%Y-%m-%d格式的字符串时就会抛出ValueError,额外循环无实际校验作用。
修正代码
将输入分割、解包、日期校验全流程纳入异常捕获,任意环节不符合要求时打印统一自定义提示,重新唤起输入框,直到输入完全符合规则才退出循环:
import datetime def validate(date_text): try: # 自动去除日期字符串前后的误输入空格 datetime.datetime.strptime(date_text.strip(), '%Y-%m-%d') return True except ValueError: print("Incorrect date entered, please enter dates in YYYY-MM-DD format ONLY") return False while True: raw_input = input("Enter employee start and termination date separated by (,) in YYYY-MM-DD format only: ") # 单独捕获分割解包异常,覆盖输入不完整、逗号数量不对的场景 try: start_date, end_date = raw_input.split(",") except ValueError: print("Incorrect date entered, please enter dates in YYYY-MM-DD format ONLY") continue # 两个日期均校验通过才退出循环 if validate(start_date) and validate(end_date): break
逻辑说明
- 所有触发ValueError的场景(输入内容分割后不足/超过2段、日期段不符合YYYY-MM-DD格式)都会被捕获,统一返回要求的自定义提示,不会弹出Python原生错误信息。
- 任意校验不通过时会通过
continue直接进入下一轮循环,重新展示输入提示,不需要额外写递归或跳转逻辑。 - 增加
strip()处理兼容用户不小心输入的前后空格,提升输入容错性。
内容的提问来源于stack exchange,提问作者biggboss2019
相关产品推荐
相关产品推荐

