日期验证程序无法输出自定义错误:ParserError问题咨询
问题解决思路
你的代码核心问题是:dateutil.parser.parse()遇到无效日期时抛出的是ParserError,但你只捕获了ValueError,导致异常未被处理直接报错。另外代码还有几处可优化的点:用eval转数字存在安全风险,歧义判断逻辑也有漏洞。
具体修正步骤
- 捕获正确的异常类型:导入
ParserError,在except中同时捕获ParserError和ValueError,确保无效日期时能输出自定义的"False"。 - 替换不安全的
eval:用int()转换分割后的日期字符串,避免执行恶意代码的风险。 - 修正歧义判断逻辑:歧义场景应为「日和月都在1-12之间」(无法区分dmy/mdy),或「年份是两位数字」(可能对应不同世纪),调整括号保证逻辑优先级正确。
- 调整代码结构:把可能抛出异常的操作(解析日期、类型转换)都放入
try块,确保所有异常都能被捕获。
修正后的代码
from dateutil.parser import parse from dateutil.parser import ParserError # 导入需要捕获的异常 import re def date_fun(date): try: # 尝试解析日期,无效日期会抛出ParserError dt = parse(date) # 分割日期字符串 dmy_split = re.split('[- /]', date) # 转换为整数,失败会抛出ValueError day = int(dmy_split[0]) month = int(dmy_split[1]) year = dmy_split[2] # 判断歧义:日和月都在1-12之间,或者年份是两位 if (1 <= day <= 12 and 1 <= month <= 12) or len(year) == 2: print("Ambiguous") else: print("True") except (ParserError, ValueError): # 捕获无效日期或转换失败的情况,输出False print("False") date_fun("30/2/2008") # 输出False date_fun("05/06/2023") # 输出Ambiguous date_fun("13/06/2023") # 输出True date_fun("05/06/23") # 输出Ambiguous
代码说明
- 将
parse(date)和int()转换都放入try块,任何解析或转换错误都会被捕获并输出"False"。 - 歧义判断逻辑更清晰:日和月都在1-12范围时无法确定格式,两位年份可能对应不同世纪,这两种情况都标记为歧义。
- 移除了无用的
dt.strftime('%d/%m/%Y')语句,因为未使用转换结果。
内容的提问来源于stack exchange,提问作者Laxmi Ty
相关产品推荐
相关产品推荐

