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()实现退出。 - 输入处理逻辑有风险&缺陷:
- 使用
eval处理用户输入存在极大安全隐患,用户可以输入任意可执行代码触发非预期行为 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
相关产品推荐
相关产品推荐

