异常导致终端重复IndexError
Posted
技术标签:
【中文标题】异常导致终端重复IndexError【英文标题】:Repeated IndexError in terminal caused by exception 【发布时间】:2019-02-23 22:29:27 【问题描述】:我正在尝试解决一项编程任务,但遇到了一些麻烦。任务内容如下:
考虑计算二次方程解的常用公式: ax2 + bx + c = 0 由下式给出 x = sqrt(b± b^2−4ac/2a) 编写程序从命令行读取 a、b 和 c 的值。使用异常处理缺少的参数,并处理 b^2-4ac 的无效输入
我的程序如下:
from math import sqrt
import sys
try:
a = float(sys.argv[1])
b = float(sys.argv[2])
c = float(sys.argv[3])
bac = b**2 - 4*a*c
if bac < 0:
raise ValueError
except IndexError:
while True:
input("No arguments read from command line!")
a = float(input("a = ? "))
b = float(input("b = ? "))
c = float(input("c = ? "))
bac = b**2 - 4*a*c
if bac > 0:
break
if bac < 0:
while True:
print("Please choose values of a,b,c so\
that b^2 - 4ac > 0")
a = float(input("a = ? "))
b = float(input("b = ? "))
c = float(input("c = ? "))
bac = b**2 - 4*a*c
if bac > 0:
break
except ValueError:
while True:
input("Please choose values of a,b,c so that b^2 - 4ac > 0")
a = float(input("a = ? "))
b = float(input("b = ? "))
c = float(input("c = ? "))
if bac > 0:
break
for i in range(-1,2,2): # i=-1, next loop > i=1
x = (b + i*sqrt(bac)) / (2*a)
print("x = %.2f"%(x))
它似乎工作正常,但在下面的情况下它没有:
terminal >
python quadratic_roots_error2.py
No arguments read from command line!
a = ? 1
b = ? 1
c = ? 1
Please choose values of a,b,c so that b^2 - 4ac > 0
a = ? 5
b = ? 2
c = ? -3
No arguments read from command line!
a = ? 5
b = ? 2
c = ? -3
x = -0.60
x = 1.00
为什么程序会弹出消息“No arguments read from command line!”?我希望程序打印 b^2-4ac > 0 的每个解决方案,并且每当 b^2-4ac 0”像它一样被打印出来。
【问题讨论】:
为什么不放一个循环语句来检查输入变量的值的性质? 输入收集代码有点重复。请参阅here 了解获取有效输入的各种有效方法。 【参考方案1】:为什么程序会弹出消息“No arguments read from command line!”?
因为它试图从命令行获取参数,但没有。
“命令行”是您输入的启动程序的命令:
python quadratic_roots_error2.py
您可以选择在键入命令时提供参数,如下所示:
python quadratic_roots_error2.py 5 99 1000
但你没有这样做,所以程序会打印该消息,然后从键盘读取输入。
如果您不想打印该消息,那为什么还要打印呢?
【讨论】:
嗨!如果我不提供命令,我希望打印消息。但是,如果您查看我的终端窗口,它会在我经历 float(input("text")) 异常后显示“没有从命令行读取参数”。【参考方案2】:你得到的IndexError
来自调用sys.argv[1]
,当索引1没有任何东西时。
正如 John Gordon 所提到的,sys.argv
正在寻找调用脚本本身时给出的输入。由于调用中没有参数,在本例中为 python quadratic_roots_error2.py
,因此在索引 1 处的列表 sys.argv
中没有任何内容。然后您的脚本将抛出一个 IndexError
,它被您的 Except IndexError
子句捕获,然后检查代码中要求 A、B 和 C 的值的部分。解决问题的最快方法是替换:
a = float(sys.argv[1])
b = float(sys.argv[2])
c = float(sys.argv[3])
与:
a = float(input("a = ? "))
b = float(input("b = ? "))
c = float(input("c = ? "))
就像你在脚本中的其他地方一样。
【讨论】:
【参考方案3】:感谢您的回复!我已将它们考虑在内,现在代码如下所示:
try:
a = float(sys.argv[1])
b = float(sys.argv[2])
c = float(sys.argv[3])
except IndexError:
input("No arguments read from command line!")
a = float(input("a = ? "))
b = float(input("b = ? "))
c = float(input("c = ? "))
try:
for i in range(-1,2,2):
x = (b + i*sqrt(b**2 - 4*a*c)) / (2*a)
print("x = %.2f"%(x))
except ValueError:
while True:
input("Please choose values a,b,c so that b**2 - 4*a*c > 0")
a = float(input("a = ? "))
b = float(input("b = ? "))
c = float(input("c = ? "))
if b**2 - 4*a*c > 0:
for i in range(-1,2,2):
x = (b + i*sqrt(b**2 - 4*a*c)) / (2*a)
print("x = %.2f"%(x))
sys.exit(1)
【讨论】:
以上是关于异常导致终端重复IndexError的主要内容,如果未能解决你的问题,请参考以下文章
FOREIGN KEY可能会导致循环或多个级联路径异常[重复]
HTTP客户端NoCache标志导致空引用异常C# [重复]