Python Try-Except块未执行异常处理,错误输入致终端无限挂起求助
代码问题排查与修复
核心问题分析
- 无限循环根源:
convert函数的while True循环始终处理传入的同一个错误输入。比如输入cat/dog或1/0时,触发异常后pass直接回到循环开头,重复解析错误数据,永远无法退出循环,导致终端卡死。 - 输入逻辑缺失:
main函数只执行一次input,没有在输入无效时重新提示用户输入的逻辑。 - gauge函数错误:最后一个分支打印固定的
Z%,未动态输出传入的百分比数值。
修复后的完整代码
def main(): while True: fuel = input("Fuel: ") try: c = convert(fuel) gauge(c) break # 输入有效时退出循环 except (ValueError, ZeroDivisionError): pass # 输入无效时重新提示 def convert(fraction): X, Y = fraction.split("/") x = int(X) y = int(Y) f = x / y if f > 1: raise ValueError("分子不能大于分母") return int(round(f * 100)) def gauge(percentage): if percentage <= 1: print("E") elif percentage >= 99: print("F") else: print(f"{percentage}%") if __name__ == "__main__": main()
修复说明
- 输入循环移至main:把输入逻辑放到
main的while True循环里,每次输入无效时重新提示用户输入,避免在convert里死循环。 - 简化convert函数:去掉
convert里的循环,把异常抛出给main处理,让职责更清晰——convert只负责有效输入的转换,输入校验和循环提示交给main。 - 修复gauge输出:把固定的
Z%改成动态的{percentage}%,正确显示百分比。 - 增加分子校验:当输入
3/2这类分子大于分母的情况时,主动抛出异常,触发重新输入。
内容的提问来源于stack exchange,提问作者python_beginner
相关产品推荐
相关产品推荐

