对于一些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!"
现在我在这里找到了一个可用的答案:Error Handling Variables in a calculator program, Error handling numbers are fine
我想知道为什么我的代码不起作用。 python是否需要函数中的异常处理?这就是我从中获得的氛围。
答案 0 :(得分: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 3中input
假设Python 2的raw_input
和raw_input
的语义消失了。
答案 1 :(得分:2)
你抓住ValueError
,这是错误的事情。
了解input()
的工作原理:
>>> print input.__doc__
input([prompt]) -> value
Equivalent to eval(raw_input(prompt)).
所以它正在做的是评估你在那一点输入的内容,就像它评估你在交互式Python会话中输入的任何内容一样。例如,如果我尝试在提示符处输入NameError
,则会收到garbagestring
,原因与我尝试在互动时输入NameError
的{{1}}相同提示:
garbagestring
执行此操作的正确方法是使用>>> 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
我可以轻松读取文件,删除重要文件夹等等。
答案 2 :(得分:0)
input
对用户的输入eval()
做了input
基本上eval(raw_input(prompt))
因此,如果您输入loop
,它就不会失败,它实际上会将choice
设置为1
。
如果您输入a
,则会评估并引发NameError
例外。
如果输入1 + 1
,它将减去。
我希望你明白这一点。