异常导致终端重复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# [重复]

计算非常大文件中的行数会导致 System OutofMemory 异常 [重复]

处理因插入重复值而导致的唯一约束异常

Fragment已经被added了导致的异常。

防止线程并发导致事务的重复执行