为什么Python try and except不能抑制错误?

ctehm74n  于 2023-05-21  发布在  Python
关注(0)|答案(2)|浏览(110)

为什么我还在进行追踪。我试图确保用户输入的是数值而不是字符串。我以为我的努力和尝试会抓住并清除压抑。
下面是程序输出,包括回溯。

# 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块能抑制回溯,并且在程序运行结束后不显示。

wwtsj6pe

wwtsj6pe1#

发生错误的原因是,在递归调用select_conversion返回后,您 * 继续 * 当前调用,其中conversion_type从未成功转换为整数。你不应该使用递归来实现循环,而且你实际上不需要首先将输入转换为整数。(例如,您并不是在尝试对输入进行算术运算;就把它当作它是的标签。)
消除这两个误差源可以使函数简单得多。

def select_conversion():
    while True:
        conversion_type = input("Select conversion type, 1) inches to mm 2) mm to inches \t")
        if conversion_type == "1":
            return in_mm()
        elif conversion_type == "2":
            return mm_in()
        else:
            print("Invalid response")
1mrurvl1

1mrurvl12#

哦,try块正确地抑制了int()转换的异常。然而,当它失败时,conversion_type仍然保持为用户输入的值。它很可能是一个字符串。然后在if语句中实际抛出错误。这样的事情正在发生:

# note that "banana" is a string, not variable
if "banana" < 3:
 print("Small banana")

它会保留在你所做的每个递归函数调用中,当你再次调用这个函数时,它不会被丢弃。
因此,最终,当用户输入正确的值时,该函数调用将正确执行。但在此之后,它转到前一个函数调用,其中的值不正确,并试图将其作为整数值处理,这引发了一个exeption。
在我看来,你应该创建一个单独的函数来从用户那里获取价值,并且只在其他函数中使用它。这是我的版本这样的函数,因为我不知道你的要求,我保持递归,虽然我不会这样做:

def get_user_input():
    user_input = input("Select conversion type, 1) inches to mm 2) mm to inches \t")
    try:
        user_input = int(user_input)
    except:
        print("Invalid response. \n")
        user_input = get_user_input()
    return user_input

你可以把它做成你想要的多功能的。这里有一个接受用户类型和消息的示例函数:

def get_user_input(message, var_type=int):
    user_input = input(message)
    try:
        user_input = var_type(user_input)
    except:
        print("Invalid response. \n")
        user_input = get_user_input(message, var_type)
    return user_input

print(get_user_input("Enter a numer please: "))

# Enter a numer please: t
# Invalid response. 
#
# Enter a numer please: j
# Invalid response. 
#
# Enter a numer please: 10
# 10

希望我帮到你了!

相关问题