异常处理有什么问题

时间:2012-03-27 02:42:19

标签: python

当我输入其中一个数字的字母时,我收到错误:

    Traceback (most recent call last):
      File "/Users/rodchar/Documents/Hello World Katie/testing.py", line 7, in <module>
        x = input("What is your first number?")
      File "<string>", line 1, in <module>
    NameError: name 's' is not defined



x = 0
y = 0

isValid = False

while isValid == False:
    x = input("What is your first number?")

    try:
        float(x)
        isValid = True
    except:
        isValid = False

    y = input("What is your second number?")

    try:
        float(y)
        isValid = True
    except:
        isValid = False


print "The answer is: %s" % (x+y)

3 个答案:

答案 0 :(得分:3)

input()尝试将其输入评估为python表达式... 因此,它会尝试评估s并查找变量s

在这种情况下,您可以将x设置为字符串:

x = raw_input("What is your first number?")

然后将转换浮动到try

注意:这仅适用于python 2,因为python 3更改input()函数以将输入作为字符串。

答案 1 :(得分:3)

首先,至少在Python 2.7中,input()不是您想要获取用户输入的内容。你真的想要raw_input()。 (这确实令人困惑,并已在Python 3中得到修复。)

其次,正如@jamylak所说,给出异常的语句不在try / catch块中。

第三,当您使用except:捕获异常时,您应该捕获特定类型的异常(except ValueError:)而不是任何和所有异常。捕获所有异常是不好的,因为它掩盖了引发您没有预料到的异常的错误。


更好的方法是:

  • 应用“不要重复自己”原则(DRY) - 从用户获取x和获取y的代码非常相似。而不是两次写同一个东西,写一次并重复使用它。
  • 在命名函数中包装“从用户那里获取一个浮动”功能。
  • 仅捕获您准备处理的特定类型的异常。

在Python 2.7上测试:

def get_float_from_user (prompt):
    while True:
        try:
            user_input = float(raw_input(prompt))
            return user_input
        except ValueError:
            print ("Not a floating point number. Please try again.")

x = get_float_from_user("Enter x.")
y = get_float_from_user("Enter y.")

print (x+y)

答案 2 :(得分:1)

当您使用input时,会在用户传递的文本上调用eval。在这种情况下,eval('s')的结果是变量s的值,未定义。所以你得到一个名字错误。如果要传递字符串,则必须将其作为字符串输入,并在其周围添加'标记。换句话说,不是s而是's'

引用docs

  

此功能不会捕获用户错误。如果输入语法无效,则会引发SyntaxError。

这在Python 3中有所改变,我最初没有提及,因为我认为最好不要复杂化,你显然使用的是Python 2. Python 3 input相当于Python 2中的raw_input