我目前正在使用此Python代码:
valid_chars = "0123456789-+/* \n";
while True:
x = "x="
y = input(" >> ")
x += y
if False in [c in valid_chars for c in y]:
print("WARNING: Invalid Equation");
continue;
if(y == "end"):
break
exec(x)
print(x)
当用户执行以下操作时崩溃:9/0。错误:
ZeroDivisionError: division by zero
有哪些方法会阻止用户将某些内容除以零?
答案 0 :(得分:6)
除ZeroDivisionError
之外,您可以这样
x = "1/0"
try:
exec(x)
except ZeroDivisionError:
print ("WARNING: Invalid Equation")
如果您使用的是Python 2.x,输入数据将在此处进行评估
y = input(" >> ")
所以,在Python 2.x中,您应该使用
y = raw_input(" >> ")
除此之外,您可以改进这段代码
if False in [c in valid_chars for c in y]:
像这样
valid_chars = set("0123456789-+/* \n") # We make this a set, because
if not all(c in valid_chars for c in y): # c in valid_chars will be in O(1)
作为@gnibbler,在评论部分中建议,同样的条件可以像这样编写
if any(c not in valid_chars for c in y): # c in valid_chars will be in O(1)
另一个建议是,不需要使用半冒号在Python中标记行尾:)
答案 1 :(得分:1)
使用try
尝试封装代码try:
y = input(" >> ")
except Exception as exc:
# process exception here
原因是在设置y之前读入input()进行评估。因此,由于input()而发生异常,并且必须使用try捕获:
答案 2 :(得分:1)
真正的问题是你正在执行exec()
两次。第一次在构造的字符串上执行它时,此将x 的值替换为输入表达式的结果。所以你第二次尝试运行exec(64)
。仔细查看try: ... except: ... else
周围的逻辑流程。
最简单的解决方法是从
开始x = "z="
然后打印z
而不是x
。这不应该阻止您努力避免重复执行代码。