Python 为什么这段代码在重复函数调用后抛出错误?

Python 为什么这段代码在重复函数调用后抛出错误?,python,python-3.x,error-handling,Python,Python 3.x,Error Handling,我有一段代码要求用户输入某个范围内的数字。我知道什么是有效的,部分是通过看下面这样的问题: 不过,在使用它的过程中,我使用了下面的函数,该函数在所有情况下都有效,除非在正确输入之前的任何时候输入了文本。例如,输入3,2,f,3,2,5会产生以下结果: TypeError:“如果捕获异常,可以打印变量以查看错误: >>> def pick_a_number(): ... user_number = input("Pick a number from 5 to 10, in

我有一段代码要求用户输入某个范围内的数字。我知道什么是有效的,部分是通过看下面这样的问题:

不过,在使用它的过程中,我使用了下面的函数,该函数在所有情况下都有效,除非在正确输入之前的任何时候输入了文本。例如,输入
3,2,f,3,2,5
会产生以下结果:


TypeError:“如果捕获异常,可以打印变量以查看错误:

>>> def pick_a_number():
...     user_number = input("Pick a number from 5 to 10, inclusive. ")
...     try:
...         user_number = int(user_number)
...     except:
...         print("Not a valid entry. Try again. ")
...         pick_a_number()
...     try:
...         if 5 <= user_number <= 10:
...             print("You picked " + str(user_number))
...         else:
...             print("Number out of range. Try again.")
...             pick_a_number()
...     except:
...         print("@@ user_number during failure is : {}".format(user_number))
...         print("@@ type(user_number) during failure is : {}".format(type(user_number)))
...
>>> pick_a_number()
Pick a number from 5 to 10, inclusive. 3
Number out of range. Try again.
Pick a number from 5 to 10, inclusive. 2
Number out of range. Try again.
Pick a number from 5 to 10, inclusive. f
Not a valid entry. Try again.
Pick a number from 5 to 10, inclusive. 3
Number out of range. Try again.
Pick a number from 5 to 10, inclusive. 2
Number out of range. Try again.
Pick a number from 5 to 10, inclusive. 5
You picked 5
@@ user_number during failure is : f
@@ type(user_number) during failure is : <class 'str'>
>>def pick_a_number():
...     user_number=输入(“从5到10中选择一个数字,包括在内”)
...     尝试:
...         用户号=整数(用户号)
...     除:
...         打印(“不是有效条目。请重试。”)
...         选择一个号码()
...     尝试:
...         如果5>选择一个编号()
从5到10(含5到10)中选择一个数字。3.
数字超出范围。再试一次。
从5到10(含5到10)中选择一个数字。2.
数字超出范围。再试一次。
从5到10(含5到10)中选择一个数字。F
不是有效的条目。再试一次。
从5到10(含5到10)中选择一个数字。3.
数字超出范围。再试一次。
从5到10(含5到10)中选择一个数字。2.
数字超出范围。再试一次。
从5到10(含5到10)中选择一个数字。5.
你选了5个
@@故障期间的用户号为:f
@@故障期间的类型(用户号)为:

如果捕获异常,您可以打印您的VAR以查看错误:

>>> def pick_a_number():
...     user_number = input("Pick a number from 5 to 10, inclusive. ")
...     try:
...         user_number = int(user_number)
...     except:
...         print("Not a valid entry. Try again. ")
...         pick_a_number()
...     try:
...         if 5 <= user_number <= 10:
...             print("You picked " + str(user_number))
...         else:
...             print("Number out of range. Try again.")
...             pick_a_number()
...     except:
...         print("@@ user_number during failure is : {}".format(user_number))
...         print("@@ type(user_number) during failure is : {}".format(type(user_number)))
...
>>> pick_a_number()
Pick a number from 5 to 10, inclusive. 3
Number out of range. Try again.
Pick a number from 5 to 10, inclusive. 2
Number out of range. Try again.
Pick a number from 5 to 10, inclusive. f
Not a valid entry. Try again.
Pick a number from 5 to 10, inclusive. 3
Number out of range. Try again.
Pick a number from 5 to 10, inclusive. 2
Number out of range. Try again.
Pick a number from 5 to 10, inclusive. 5
You picked 5
@@ user_number during failure is : f
@@ type(user_number) during failure is : <class 'str'>
>>def pick_a_number():
...     user_number=输入(“从5到10中选择一个数字,包括在内”)
...     尝试:
...         用户号=整数(用户号)
...     除:
...         打印(“不是有效条目。请重试。”)
...         选择一个号码()
...     尝试:
...         如果5>选择一个编号()
从5到10(含5到10)中选择一个数字。3.
数字超出范围。再试一次。
从5到10(含5到10)中选择一个数字。2.
数字超出范围。再试一次。
从5到10(含5到10)中选择一个数字。F
不是有效的条目。再试一次。
从5到10(含5到10)中选择一个数字。3.
数字超出范围。再试一次。
从5到10(含5到10)中选择一个数字。2.
数字超出范围。再试一次。
从5到10(含5到10)中选择一个数字。5.
你选了5个
@@故障期间的用户号为:f
@@故障期间的类型(用户号)为:

递归调用
选择一个编号
不会改变变量
用户编号
的值。您最好使用
while循环
。在Python中,递归不是处理这种情况的合适方法。此外,您的函数不会返回任何内容。
后面的行除了
如果输入不是int,则在
选择一个数字()之后运行。
call finishes查看“我的代码为什么做X?”的答案几乎总是:Add
print()
语句无处不在,直到它变得清晰为止。它有一节专门介绍了为什么要避免您尝试的递归方法。递归调用
选择一个\u编号
不会改变变量
用户\u编号
的值。您最好使用
while循环
。在Python中,递归不是处理这种情况的合适方法。此外,您的函数不会返回任何内容。
后面的行除了
如果输入不是int,则在
选择一个数字()之后运行。
call finishes查看“我的代码为什么做X?”的答案几乎总是:Add
print()
语句无处不在,直到它变得清晰为止。它有一节专门介绍了为什么要避免您尝试的递归方法。我知道您在这里得到了什么,但我不明白的是,为什么直到稍后才会发生错误。当通过函数运行“f”时,它会命中异常并再次调用该函数,然后再完成几轮。只有在“成功”条目之后才会抛出错误。只有在成功的情况下,递归堆栈才会完全“展开”。在每个块中添加一个print语句,以便了解发生了什么。递归最好是直观地理解。我可以删除我的答案,因为我主要是想向您展示我在评论中提到的调试技术。@Stidgeon,……要记住的是,当您调用某个东西时,这不是“转到”,而是函数调用;当函数返回时,代码会在调用之前的位置返回。(堆栈详细说明了调用树不同级别的局部变量存储以及参数和返回值的传统存储方式)。我看到了这里的内容,但我不明白的是,为什么直到稍后才会发生错误。当通过函数运行“f”时,它会命中异常并再次调用该函数,然后再完成几轮。只有在“成功”条目之后才会抛出错误。只有在成功的情况下,递归堆栈才会完全“展开”。在每个块中添加一个print语句,以便了解发生了什么。递归最好是直观地理解。我可以删除我的答案,因为我主要是想向您展示我在评论中提到的调试技术。@Stidgeon,……要记住的是,当您调用某个东西时,这不是“转到”,而是函数调用;当函数返回时,代码会在调用之前的位置返回。(堆栈详细说明了调用树不同级别的局部变量的存储方式,以及参数和返回值)。