Python程序无法通过Ctrl+C终止求助(CS50P PS3)
解决Python程序无法用Ctrl+C终止的问题
问题原因
你的代码存在两个关键问题导致Ctrl+C无法终止程序:
- 全局的
except:语句捕获了所有异常,包括Ctrl+C触发的KeyboardInterrupt异常,直接跳过了终止逻辑。 - 内层的
while y < 31:存在逻辑错误——y是字符串类型,和整数31的比较会导致这个循环无限运行,同时被外层的异常捕获逻辑挡住,无法响应终止信号。
紧急终止当前运行的程序
- 直接关闭运行程序的终端窗口。
- Windows用户打开任务管理器,找到Python进程后结束它;Mac用户打开活动监视器,定位Python进程并强制退出。
- 如果使用CS50在线环境,点击界面上的"Reset"按钮重置运行环境。
修复代码解决根本问题
要让程序正常响应Ctrl+C,同时修复日期解析的逻辑错误,做以下修改:
- 精准捕获异常:
把except:改为except (ValueError, IndexError):,只捕获输入拆分、类型转换时的预期错误,让KeyboardInterrupt能正常触发终止程序。 - 修复循环与逻辑错误:
- 内层的
while循环完全多余,应该改成if来校验日期合法性;同时要把字符串类型的日、月转成整数后再做范围判断。 - 字典取值用
month[x]替代不存在的month.value(x)方法。
- 内层的
- 完善日期格式化:
确保日和月输出为两位数字,比如用f"{day_str:0>2}"格式化。
修复后的示例代码:
month = { "January": "01", "February": "02", "March": "03", "April": "04", "May": "05", "June": "06", "July": "07", "August": "08", "September": "09", "October": "10", "November": "11", "December": "12" } while True: try: date = input("Date: ").strip() if date[0].isdecimal(): # 处理MM/DD/YYYY格式 month_str, day_str, year = date.split("/") month_num = int(month_str) day_num = int(day_str) if 1 <= month_num <= 12 and 1 <= day_num <= 31: print(f"{year}-{month_str:0>2}-{day_str:0>2}") elif date[0].isalpha(): # 处理Month DD, YYYY格式 month_name, day_str, year = date.split() day_str = day_str.replace(",", "") month_name = month_name.title() day_num = int(day_str) if month_name in month and 1 <= day_num <= 31: print(f"{year}-{month[month_name]}-{day_str:0>2}") except (ValueError, IndexError): pass
内容的提问来源于stack exchange,提问作者Đinh Quốc Huy
相关产品推荐
相关产品推荐

