1

为了进行一些 Python 练习,我决定编写一个计算器教程。这是非常基本的,所以我决定在用户​​输入垃圾时给它异常处理。虽然程序的正确使用仍然有效,但废话仍然会导致它崩溃,输入这里是我的代码:

loop = 1

choice = 0

while loop == 1:
    #print out the options you have
    print "Welcome to calculator.py"

    print "your options are:"

    print " "
    print "1) Addition"
    print "2) Subtraction"

    print "3) Multiplication"

    print "4) Division"
    print "5) Quit calculator.py"
    print " "

    choice = input("choose your option: ")
    try:
        if choice == 1:
            add1 = input("add this: ")
            add2= input("to this: ")
            print add1, "+", add2, "=", add1+ add2
        elif choice == 2:
            sub1 = input("Subtract this ")
            sub2 = input("from this")
            print sub1, "-", sub2, "=", sub1 - sub2
        elif choice == 3:
            mul1 = input("Multiply this: ")
            mul2 = input("with this: ")
            print mul1, "x", mul2, "=", mul1 * mul2
        elif choice == 4:
            div1 = input("Divide this: ")
            div2 = input("by this: ")
            if div2 == 0:
                print "Error! Cannot divide by zero!  You'll destroy the universe! ;)"
            else:

                print div1, "/", div2, "=", div1 * div2
        elif choice == 5:
            loop = 0
        else:
            print "%d is not valid input. Please enter 1, 2 ,3 ,4 or 5." % choice

    except ValueError:
        print "%r is not valid input.  Please enter 1, 2, 3, 4 or 5." % choice
    print "Thank you for using calculator.py!"

现在,虽然我在这里找到了一个有用的答案:计算器程序中的错误处理变量,错误处理数字很好

我想知道为什么我的代码不起作用。python是否想要函数中的异常处理?这就是我从中得到的氛围。

4

3 回答 3

5

在 Python 2(这是您正在使用的)input中,无论用户输入什么,都将计算为 Python 代码。因此input会引发许多不同的异常,但很少出现ValueError.

更好的是接受您的输入并raw_input返回一个字符串,然后转换为预期的类型。如果输入无效,它将引发ValueError

>>> x = int(raw_input("enter something: "))
enter something: sdjf
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'sdjf'

注意:在 Python 3input中假定 Python 2 的语义raw_inputraw_input消失。

于 2012-06-01T15:03:45.490 回答
2

你在抓ValueError,这是错误的抓。

看看是如何input()工作的:

>>> print input.__doc__
input([prompt]) -> value

Equivalent to eval(raw_input(prompt)).

因此,它所做的是评估您在该点输入的内容,就像它评估您在交互式 Python 会话中输入的任何内容一样。例如,NameError如果我尝试garbagestring在提示符处输入,我会得到 a,出于同样的原因,NameError如果我尝试garbagestring在交互式提示符处输入,我会得到 a:

>>> garbagestring
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'garbagestring' is not defined

正确的做法是使用raw_input()代替input(),然后将返回的字符串转换为整数:

>>> raw_input('Prompt: ')
Prompt: garbagestring
'garbagestring'
>>> int(raw_input('Prompt: '))
Prompt: garbagestring
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'garbagestring'
>>> int(raw_input('Prompt: '))
Prompt: 45
45

这将在您使用它时捕获错误。

请注意,一般情况下,您应该避免做任何看起来像eval(). 通常,您可以在没有它的情况下实现您需要的任何东西,eval()如果使用您不信任的字符串,则可能存在安全风险。例如,如果我import os在脚本顶部添加(一个非常常见的导入),我可以这样做:

Multiply this: os.listdir('/')
with this: 0
['bin', 'cygdrive', 'dev', 'etc', 'home', 'lib', 'tmp', 'usr', 'var', 'proc'] x 0 = []
Thank you for using calculator.py!

我可以轻松读取文件、删除重要文件夹等。

于 2012-06-01T15:14:59.103 回答
0

inputeval()对用户的输入做一个,基本上input做一个eval(raw_input(prompt))

因此,如果您输入loop,它不会失败,它实际上会设置choice1

如果您输入a,它将评估并引发NameError异常。

如果你输入1 + 1它会减去。

我希望你能明白。

于 2012-06-01T15:19:36.327 回答