日期验证函数check_dates()应放置在add_leave()中的哪个位置?
日期验证函数
check_dates()在add_leave()中的正确放置位置 问题描述
我有一个日期验证函数check_dates(),功能是检查输入的开始日期是否早于结束日期,当开始日期晚于结束日期时会抛出ValueError。现在想把它用到添加请假记录的add_leave()函数里,要求日期无效时不要打印“Leave Confirmed”。
现有代码如下:
def add_leave(self): data_l = [] self.check_dates(start_date, end_date) try: with open ("data.csv","r") as data: reader = csv.reader(data) user_id = self.user_id_validation() for row in reader: if row[0] == user_id: leave = self.leave_option.get() start_date = "-".join([self.start_date_entry.get()]) end_date = "-".join([self.end_date_entry.get()]) row.append(leave) row.append(start_date) row.append(end_date) data_l.append(row) with open ("data.csv","w", newline='') as data: writer = csv.writer(data) writer.writerows(data_l) print("Leave Confirmed") except: print("Leave has not been confirmed.")
我尝试了以下代码,但无法正常工作:
def add_leave(self): data_l = [] self.check_dates(start_date, end_date) try: with open ("data.csv","r") as data: reader = csv.reader(data) user_id = self.user_id_validation() for row in reader: if row[0] == user_id: leave = self.leave_option.get() start_date = "-".join([self.start_date_entry.get()]) end_date = "-".join([self.end_date_entry.get()]) try: if self.check_dates(start_date,end_date): raise ValueError return(start_date,end_date) except: messagebox.showinfo("Invalid Input", "Please select valid start and end dates.\nThe start date should be earlier than the end date.") row.append(leave) row.append(start_date) row.append(end_date) data_l.append(row) with open ("data.csv","w", newline='') as data: writer = csv.writer(data) writer.writerows(data_l) print("Leave Confirmed") except: print("Leave has not been confirmed.")
问题分析
你之前的代码存在几个核心问题:
- 初始调用
self.check_dates(start_date, end_date)时,start_date和end_date还未从输入框获取值,属于未定义变量,直接会触发报错。 - 错误判断
check_dates的返回值:该函数本身会在日期无效时抛出ValueError,无需手动再次raise异常。 - 嵌套的
try-except未阻断后续流程:即使日期验证失败,代码仍会执行到文件写入和“Leave Confirmed”打印步骤。 - 裸
except会捕获所有异常,不利于排查文件读写等其他类型的错误。
正确实现方式
遵循先验证、后执行的逻辑:先获取所有输入数据,立刻做日期验证,验证通过再处理文件操作;验证失败则直接终止流程,不执行后续写入和确认步骤。
修正后的代码如下:
def add_leave(self): data_l = [] try: # 先获取所有必要的输入数据 user_id = self.user_id_validation() leave = self.leave_option.get() start_date = "-".join([self.start_date_entry.get()]) end_date = "-".join([self.end_date_entry.get()]) # 关键:在这里调用日期验证,失败会直接抛出ValueError进入except块 self.check_dates(start_date, end_date) # 验证通过后再处理文件读写 with open("data.csv", "r") as data: reader = csv.reader(data) for row in reader: if row[0] == user_id: row.append(leave) row.append(start_date) row.append(end_date) data_l.append(row) with open("data.csv", "w", newline='') as data: writer = csv.writer(data) writer.writerows(data_l) print("Leave Confirmed") except ValueError: # 捕获日期验证失败的异常 messagebox.showinfo("Invalid Input", "Please select valid start and end dates.\nThe start date should be earlier than the end date.") print("Leave has not been confirmed.") except Exception as e: # 捕获其他异常(比如文件操作错误) print(f"Leave has not been confirmed. Error: {str(e)}")
代码说明
- 数据与验证顺序:先从输入框获取所有数据,紧接着调用
check_dates验证,确保只有日期有效时才会执行后续文件操作。 - 精细化异常捕获:分开捕获
ValueError(日期验证失败)和其他通用异常,既能精准处理日期错误,也能排查其他问题。 - 流程阻断:日期验证失败时直接进入对应
except块,不会执行到文件写入和“Leave Confirmed”打印步骤,符合需求。 - 移除无效逻辑:删除了原代码中多余的
return(start_date,end_date)和错误的if self.check_dates(...)判断,利用check_dates本身的抛异常机制处理验证失败。
内容的提问来源于stack exchange,提问作者amsi_25
相关产品推荐
相关产品推荐

