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

Python代码中exit()无法退出且正确输入也触发except是什么原因

卡路里计算代码异常问题解决方案

原始问题

代码预期实现逻辑:程序循环等待用户输入,直到输入正确的数值后完成卡路里计算,打印结果后直接退出运行。
原始代码如下:

import sys
def main():
    while True:
        try: 
            print("Please enter Age,Weight,Heart Rate and Workout Time ")
            Age,Weight,HR,Time = map(eval,input().split(' '))
            men = ( (Age * 0.2017) - (Weight * 0.09036) + (HR * 0.6309) - 55.0969 ) * Time / 4.184
            women =  ( (Age * 0.074) - (Weight * 0.05741) + (HR * 0.4472) - 20.4022 ) * Time / 4.184
            print("Men:",men," Calories \nWomen:",women,"Calories \n")
            exit()
        except:
            print("Please enter numbers only \n \n")

if __name__ == '__main__':
    main()

实际运行现象:即使用户输入正确数值,程序也会进入异常分支,无法正常退出。

错误原因

  • 核心问题:使用了裸except语句,会捕获所有类型的异常,包括exit()执行时抛出的SystemExit异常,导致退出逻辑被拦截,直接进入异常分支。
  • 退出函数使用错误:导入了sys模块但没有使用,exit()是交互式解释器的内置函数,在脚本运行环境中建议使用sys.exit()实现退出。
  • 输入处理逻辑有风险&缺陷:
    1. 使用eval处理用户输入存在极大安全隐患,用户可以输入任意可执行代码触发非预期行为
    2. split(' ')只能处理单个空格分隔的输入,如果用户输入多个空格、制表符分隔内容会产生空字符串,触发类型转换错误
  • 没有指定异常捕获范围,无法区分是输入错误还是其他代码逻辑错误。

修复后代码

import sys
def main():
    while True:
        try: 
            print("请输入年龄、体重、心率、运动时长,用空格分隔:")
            Age,Weight,HR,Time = map(float, input().split())
            men = ( (Age * 0.2017) - (Weight * 0.09036) + (HR * 0.6309) - 55.0969 ) * Time / 4.184
            women =  ( (Age * 0.074) - (Weight * 0.05741) + (HR * 0.4472) - 20.4022 ) * Time / 4.184
            print(f"男性消耗卡路里:{men:.2f}\n女性消耗卡路里:{women:.2f}")
            sys.exit()
        except ValueError:
            print("输入错误,请仅输入数字,多个值用空格分隔\n")

if __name__ == '__main__':
    main()

优化说明

  • 仅捕获ValueError类型异常,只处理输入格式错误的场景,不会拦截正常的退出逻辑
  • 替换eval为float做类型转换,消除安全隐患
  • 替换split(' ')为默认split(),支持任意空白字符分隔输入
  • 输出结果保留两位小数,可读性更高
  • 提示文本修改为中文,更符合使用习惯

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:15:04