Python捕获ZeroDivisionError/ValueError时循环无法重复提问的问题
问题分析与修正方案
错误点拆解
- 输入未循环:原
main函数只执行一次input(),输入出错后不会重新发起提问。 - 异常捕获位置错误:
convert函数里,字符串转整数的代码写在try块外面,一旦输入非数字(比如three/four)或分母为0,会直接触发异常但没被捕获,导致程序卡住。 - convert循环逻辑无效:原
convert里的while True完全没用——X和Y在循环外就赋值了,异常块的pass只会让函数无返回值,main里拿不到有效结果也不会重新输入。
修正后的代码
def main(): """打印油箱剩余油量百分比""" while True: fuel = input("Fuel remaining: ") try: gas = convert(fuel) print(gas) break # 输入正确则退出循环 except (ValueError, ZeroDivisionError): continue # 出错直接进入下一轮输入 def convert(fraction): """将分数转换为整数百分比并返回""" numbers = fraction.split('/') if len(numbers) != 2: raise ValueError X = int(numbers[0]) Y = int(numbers[1]) if Y == 0: raise ZeroDivisionError if X > Y: raise ValueError return round((X / Y) * 100) if __name__ == "__main__": main()
修正说明
- main函数加循环:用
while True持续请求输入,直到convert返回有效结果才退出循环。 - convert主动抛异常:不再吞掉异常,而是在格式错误、分母为0、分子大于分母时主动抛出对应异常,让
main的try-except捕获后重新发起输入。 - 补全格式验证:增加了对输入是否为X/Y格式的判断,避免非预期输入触发未知错误。
内容的提问来源于stack exchange,提问作者Alfalfa9055
相关产品推荐
相关产品推荐

