Python BMI计算器预定义ZeroDivisionError捕获未生效问题
问题根因
- 计算BMI的代码执行顺序早于输入合法性校验逻辑:第一次获取用户输入的身高体重后,直接就执行了BMI除法计算,此时如果用户输入的身高为0,还没进入你写的while校验循环和异常捕获块,就会直接抛出
ZeroDivisionError。 - 异常捕获的位置完全错误:你将
try-except包裹在重新输入的代码块中,而输入操作本身不会触发除法运算,所以ZeroDivisionError永远不会被你写的except块捕获。 - 校验通过后没有重新计算BMI:即便后续用户输入了合法的数值,你打印的还是第一次输入时计算的错误BMI值,结果不符合预期。
修复后代码
def bmi_calculator(): while True: try: user_height = float(input('请输入您的身高(单位:厘米): ')) user_weight = float(input('请输入您的体重(单位:千克): ')) if user_height <= 0 or user_weight <= 0: print("身高或体重不能小于等于0,请重新输入") continue bmi = user_weight / (user_height / 100) ** 2 return f'您的BMI值为: {bmi}' except ZeroDivisionError: print("身高不能为0,请重新输入") print(bmi_calculator())
修复说明
- 用无限循环包裹整个输入+校验+计算流程,只要任意环节不合法就自动回到输入步骤
- 把BMI计算逻辑移到合法性校验之后,确保只有合法数值才会参与计算
- 把除法计算逻辑放到
try块内,此时如果出现除零异常会被正常捕获,触发重新输入逻辑 - 合法计算完成后直接返回结果,跳出循环,无冗余代码
内容的提问来源于stack exchange,提问作者Luka Morchiladze
相关产品推荐
相关产品推荐

