【问题标题】:" during the handling of above exception, another exception occurred " for the first input in the for loop“在处理上述异常过程中,发生了另一个异常”,for循环中的第一个输入
【发布时间】:2020-05-18 22:52:21
【问题描述】:

当我在 for 循环的输入前面写“int”时,我为非整数输入写的 try/except 块回溯错误“在处理上述异常期间,发生了另一个异常”显示。但是,在该范围内的所有其他输入上,try/except 块被识别并打印出我写的错误消息。

代码

QLEN = 11
MAX_NUM = 12

for i in range(1,QLEN):
  int2 = (random.randint(1,MAX_NUM))
  int1 = (random.randint(1,MAX_NUM))
  print()
  print("Question {}".format(i))
  try:
    ans = int(input("{} + {}: ".format(int1,int2)))
    add(int1,int2,ans)
  except ValueError:
    add(int1,int2,ans)

“添加”功能

def add(a,b,c):
  if a + b != c:
    print("Incorrect")
    print("Correct Answer Was {}".format(a + b))
    return (a + b)
    print()
  else:
    print("Correct")

错误

Traceback (most recent call last):
  File "main.py", line 125, in <module>
    ans = int(input("{} + {}: ".format(int1,int2)))
ValueError: invalid literal for int() with base 10: 'e'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "main.py", line 128, in <module>
    add(int1,int2,ans)
NameError: name 'ans' is not defined

【问题讨论】:

  • 那是因为在您的 except 块中您做了一些事情来触发异常。还请包括您得到的异常的完整追溯
  • 谢谢,我现在将其包括在内。这是我的第一篇文章。

标签: python


【解决方案1】:

您尝试执行相同的欺诈代码,导致在 except 块中的 try 块中出现异常。此外,python 缩进约定是 4 个空格,而不是两个。您的原始代码将产生类似以下的错误消息:

Traceback (most recent call last):
  File "/Users/eric/Desktop/ Python_Files/stackoverflow/0008.py", line 21, in <module>
    ans = int(input("{} + {}: ".format(int1,int2)))
ValueError: invalid literal for int() with base 10: 'ans'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/eric/Desktop/ Python_Files/stackoverflow/0008.py", line 24, in <module>
    add(int1,int2,ans)
NameError: name 'ans' is not defined

尝试使用下面的代码(除了块不同)

import random

QLEN = 11
MAX_NUM = 12

def add(a,b,c):
  if a + b != c:
    print("Incorrect")
    print("Correct Answer Was {}".format(a + b))
    return (a + b)
    print()
  else:
    print("Correct")

for i in range(1,QLEN):
  int2 = (random.randint(1,MAX_NUM))
  int1 = (random.randint(1,MAX_NUM))
  print()
  print("Question {}".format(i))
  try:
    ans = int(input("{} + {}: ".format(int1,int2)))
    add(int1,int2,ans)
  except ValueError:
    print("You answered with something that wasn't an integer!")

用其他任何东西替换 except 块,例如,在这种情况下,您没有以正确格式回答的通知应该可以工作。

这是一个示例输出:

Question 1
9 + 10: 21
Incorrect
Correct Answer Was 19

Question 2
2 + 1: 3
Correct

Question 3
8 + 7: 15
Correct

Question 4
8 + 12: LOL
You answered with something that wasn't an integer!

【讨论】:

    【解决方案2】:

    int 因 ValueError 失败,因为它无法解析不是整数的东西。这导致它触发except 部分,该部分使用ans 调用add。然而,ans 是一个未知变量,因为它从未被赋值(int 失败),导致另一个异常在处理前一个时

    与某些语言不同,在 Python 中,如果您不指定值,则不会有任何“默认”值。

    这里是修正后的 sn-p:

    print("Question {}".format(i))
    try:
        ans = int(input("{} + {}: ".format(int1,int2)))
    except ValueError:
        print("Bad input!")
        continue
    
    add(int1,int2,ans)
    

    你期望失败的是int,所以你用try/except包围它。如果它失败了,你 continue 从而跳过循环后面的 add 调用。如果没有例外,那么您就有一个很好的ans,您可以使用所有整数参数调用add

    此外,return (a+b) 之后的print() 永远无法执行,因为return 将离开该函数。此外,您不需要在像 int2 = (random.randint(1,MAX_NUM)) 这样的表达式中使用外括号,因为它们只会增加混乱,并且可能会与具有一个元素的元组混淆。

    【讨论】:

    • 谢谢,您是否建议我将ans 定义为except 中的字符串,以便可以毫无问题地调用add
    • @JackTucker 即使您可以将任何对象类型作为参数发送给函数,但我建议您不要这样做,而只使用一种类型(在这种情况下,所有 ints 都代表 @987654342 @)。不应该在该函数中处理错误的输入,因为这不是它的目的。我编辑了答案以提供代码 sn-p。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    相关资源
    最近更新 更多