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

while循环中Try-except语句失效及时间转换函数逻辑异常求助

12小时制转24小时制代码问题修复

原代码存在的核心问题

  • 输入逻辑错误:仅在循环外获取一次输入,报错后无法重新收集有效输入,导致程序陷入无效重试
  • 类型不匹配:将字符串类型的hour直接与整数12比较,所有时间分支判断全部失效
  • 格式不规范:分钟为个位数时输出格式不一致(如0:5而非00:05)
  • 容错性差:未处理meridiem的大小写输入,也未校验小时/分钟的合法范围

修正后的代码

def convert_12_to_24(hour, minute, meridiem):
    # 统一转换为大写,兼容任意大小写输入
    meridiem = meridiem.upper()
    # 12AM 转为00点
    if hour == 12 and meridiem == 'AM':
        print(f"00:{minute:02d}")
    # 12PM 保持12点
    elif hour == 12 and meridiem == 'PM':
        print(f"12:{minute:02d}")
    # 其他PM时间,小时加12
    elif meridiem == 'PM':
        print(f"{hour + 12}:{minute:02d}")
    # 其他AM时间,直接格式化输出
    else:
        print(f"{hour:02d}:{minute:02d}")

while True:
    try:
        # 每次循环重新获取输入,确保错误后可重新输入
        hour = int(input("Hour: ").strip())
        minute = int(input("Minute: ").strip())
        meridiem = input("AM or PM: ").strip()
        
        # 校验输入合法性
        if not (1 <= hour <= 12):
            raise ValueError("小时必须是1-12之间的整数")
        if not (0 <= minute <= 59):
            raise ValueError("分钟必须是0-59之间的整数")
        if meridiem.upper() not in ('AM', 'PM'):
            raise ValueError("请输入AM或PM(大小写均可)")
        
        convert_12_to_24(hour, minute, meridiem)
        break  # 转换成功,退出循环
        
    except ValueError as e:
        print(f"\n错误:{str(e)},请重新输入!")

关键修改说明

  1. 输入循环重构:将输入逻辑移入while True循环内部,每次报错后重新提示用户输入,解决无法重新执行的问题
  2. 类型处理与校验:直接将小时/分钟转换为整数,同时校验合法范围,避免无效输入进入转换逻辑
  3. 分支逻辑修正:使用整数类型的hour进行判断,确保12AM/12PM等特殊情况正确触发
  4. 格式统一:使用f-string的{:02d}格式化,确保小时/分钟始终显示为两位数字
  5. 容错性优化:将meridiem转换为大写,兼容任意大小写输入;捕获具体的ValueError,避免隐藏未知错误
  6. 错误提示优化:直接告知用户具体错误原因,而非泛泛的格式提示

内容的提问来源于stack exchange,提问作者AspectST

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:01:34