为什么我还在进行追踪。我试图确保用户输入的是数值而不是字符串。我以为我的努力和尝试会抓住并清除压抑。
下面是程序输出,包括回溯。
# python conversion.py
Select conversion type, 1) inches to mm 2) mm to inches -1
Invalid response.
Select conversion type, 1) inches to mm 2) mm to inches g
Invalid response.
Select conversion type, 1) inches to mm 2) mm to inches 1
Please specify inches in decimal to convert to mm 1
1.0 inches is equal to 25.4 mm
Traceback (most recent call last):
File "/home/mcolombo/conversion.py", line 67, in <module>
select_conversion()
File "/home/mcolombo/conversion.py", line 58, in select_conversion
select_conversion()
File "/home/mcolombo/conversion.py", line 56, in select_conversion
if conversion_type < 1:
TypeError: '<' not supported between instances of 'str' and 'int'
下面是抛出错误的代码片段。
48 def select_conversion():
49 conversion_type=input("Select conversion type, 1) inches to mm 2) mm to inches \t")
50 try: # checks if input is numeric
51 conversion_type = int(conversion_type)
52 except:
53 print("Invalid response. \n")
54 pass
55 select_conversion()
56 if conversion_type < 1:
57 print("Invalid response. \n")
58 select_conversion()
59 elif int(conversion_type) > 2:
60 print("Invalid response. \n")
61 select_conversion()
62 elif int(conversion_type) == 1:
63 in_mm()
64 else:
65 mm_in()
66
我希望except块能抑制回溯,并且在程序运行结束后不显示。
2条答案
按热度按时间wwtsj6pe1#
发生错误的原因是,在递归调用
select_conversion
返回后,您 * 继续 * 当前调用,其中conversion_type
从未成功转换为整数。你不应该使用递归来实现循环,而且你实际上不需要首先将输入转换为整数。(例如,您并不是在尝试对输入进行算术运算;就把它当作它是的标签。)消除这两个误差源可以使函数简单得多。
1mrurvl12#
哦,try块正确地抑制了
int()
转换的异常。然而,当它失败时,conversion_type
仍然保持为用户输入的值。它很可能是一个字符串。然后在if
语句中实际抛出错误。这样的事情正在发生:它会保留在你所做的每个递归函数调用中,当你再次调用这个函数时,它不会被丢弃。
因此,最终,当用户输入正确的值时,该函数调用将正确执行。但在此之后,它转到前一个函数调用,其中的值不正确,并试图将其作为整数值处理,这引发了一个exeption。
在我看来,你应该创建一个单独的函数来从用户那里获取价值,并且只在其他函数中使用它。这是我的版本这样的函数,因为我不知道你的要求,我保持递归,虽然我不会这样做:
你可以把它做成你想要的多功能的。这里有一个接受用户类型和消息的示例函数:
希望我帮到你了!