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

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()

修正说明

  1. main函数加循环:用while True持续请求输入,直到convert返回有效结果才退出循环。
  2. convert主动抛异常:不再吞掉异常,而是在格式错误、分母为0、分子大于分母时主动抛出对应异常,让main的try-except捕获后重新发起输入。
  3. 补全格式验证:增加了对输入是否为X/Y格式的判断,避免非预期输入触发未知错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:25:23