Python 什么';异常处理有什么问题吗

Python 什么';异常处理有什么问题吗,python,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 <m

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

    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)
回溯(最近一次呼叫最后一次):
文件“/Users/rodchar/Documents/Hello World Katie/testing.py”,第7行,在
x=输入(“您的第一个数字是多少?”)
文件“”,第1行,在
NameError:未定义名称“s”
x=0
y=0
isValid=False
当isValid==False时:
x=输入(“您的第一个数字是多少?”)
尝试:
浮动(x)
isValid=True
除:
isValid=False
y=输入(“您的第二个号码是什么?”)
尝试:
浮动(y)
isValid=True
除:
isValid=False
打印“答案是:%s”%(x+y)
input()
尝试将其输入作为python表达式进行求值。。。 因此,它尝试计算
s
,并查找变量
s

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

x = raw_input("What is your first number?")
然后在
try
块中进行浮点转换


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

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

引述:

此函数不捕获用户错误。如果输入在语法上无效,将引发SyntaxError


这在Python3中发生了变化,我最初没有提到这一点,因为我认为最好不要使事情复杂化,而且您显然正在使用Python2。但是,
input
in相当于Python 2中的

首先,至少在Python 2.7中,
input()
不是获取用户输入所需的。实际上,您需要
原始输入()
。(这确实令人困惑,在Python3中已经修复。)

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

第三,当您使用
except:
捕获异常时,您实际上应该捕获特定类型的异常(
except ValueError:
),而不是任何和所有异常。捕获所有异常是不好的,因为它掩盖了引发意外异常的bug


写这篇文章的更好方法是:

  • 应用“不要重复自己”原则(干式)-从用户处获取
    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)

有没有更好的编写方法?这是一个比这个问题更好的答案:)输入
s
作为
x=input(“prompt>>”)
的输入不会试图分配
x=s
。相反,它试图计算语句
s
,就像您在Python解释器中输入它一样。实际上,Python 2.7的
input()
根本不返回任何内容<代码>输入(提示)相当于
eval(原始输入(提示))