You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python程序无法通过Ctrl+C终止求助(CS50P PS3)

解决Python程序无法用Ctrl+C终止的问题

问题原因

你的代码存在两个关键问题导致Ctrl+C无法终止程序:

  1. 全局的except:语句捕获了所有异常,包括Ctrl+C触发的KeyboardInterrupt异常,直接跳过了终止逻辑。
  2. 内层的while y < 31:存在逻辑错误——y是字符串类型,和整数31的比较会导致这个循环无限运行,同时被外层的异常捕获逻辑挡住,无法响应终止信号。

紧急终止当前运行的程序

  • 直接关闭运行程序的终端窗口。
  • Windows用户打开任务管理器,找到Python进程后结束它;Mac用户打开活动监视器,定位Python进程并强制退出。
  • 如果使用CS50在线环境,点击界面上的"Reset"按钮重置运行环境。

修复代码解决根本问题

要让程序正常响应Ctrl+C,同时修复日期解析的逻辑错误,做以下修改:

  1. 精准捕获异常:
    把except:改为except (ValueError, IndexError):,只捕获输入拆分、类型转换时的预期错误,让KeyboardInterrupt能正常触发终止程序。
  2. 修复循环与逻辑错误:
    • 内层的while循环完全多余,应该改成if来校验日期合法性;同时要把字符串类型的日、月转成整数后再做范围判断。
    • 字典取值用month[x]替代不存在的month.value(x)方法。
  3. 完善日期格式化:
    确保日和月输出为两位数字,比如用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:39:54