大松_Dason 2022-02-10 18:52 采纳率: 100%
浏览 66
已结题

为什么会这段代码有ValueError和NameError

做了一个生肖计算器,想要做到按q退出。但如果不是第一次询问年份时输入q并不会退出,如果第一次询问是输入q就会引发ValueError和NameError。

代码:

while True:
    # 解决year不是数字或q导致的异常
    try:
        year = int(input('请输入公历年份或退出。'))
    except ValueError as e:
        if year == 'q':
            break
        else:
            continue
    finally:
        print('')

非第一次询问时输入q运行结果:

请输入公历年份或退出。2022

生肖:虎

请输入公历年份或退出。q

请输入公历年份或退出。

第一次询问时输入q运行结果:

请输入公历年份或退出。q

Traceback (most recent call last):
  File "C:/Users/xu zi yao/PycharmProjects/untitled1/生肖计算器.py", line 8, in <module>
    year = int(input('请输入公历年份或退出。'))
ValueError: invalid literal for int() with base 10: 'q'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/Users/xu zi yao/PycharmProjects/untitled1/生肖计算器.py", line 10, in <module>
    if year == 'q':
NameError: name 'year' is not defined

我用了try-except-finally语句处理ValueError但没用,并且还会引发NameError,哪里错了吗?

  • 写回答

1条回答 默认 最新

  • SmallAntJ 2022-02-10 19:34
    关注

    因为你直接把input的得到的字符转换成int,如果你输入的是‘q’就会抛出异常,执行except部分。
    如果你输入年份,try成功,except部分不会被执行;
    如果你第一次输入‘q',try失败检测到异常,year不会被赋值,然后执行到except部分时year就未定义,所以有NameError;
    如果你第一次输入年份,之后再输入’q‘,try失败,但此时year会是你前一次成功执行时的数值,year就有定义。
    所以你把 if year == 'q': break 放在except里面是不行的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 2月18日
  • 已采纳回答 2月10日
  • 创建了问题 2月10日

悬赏问题

  • ¥15 yolov8边框坐标
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂