输入不当需要打印出错误信息;验证

Need to print out error messages for improper input; validation

我正在编写一个 python 脚本,我在其中找到三个数字之和的平均值。我正在使用参数来输入数字。我需要通过打印出错误消息来完成脚本。 如果我输入类似:

它需要打印一个错误告诉我如何使用它。

这是脚本的开头:

def main():
    num1 = int(sys.argv[1])
    num2 = int(sys.argv[2])
    num3 = int(sys.argv[3])
    avg = (num1 + num2 + num3)/3
    print("The average of " +str(num1) + " " + str(num2) + " " + str(num3) + " " + "is " + str(round(avg,2)))

如果您正在谈论捕获 one arg 作为错误,您可以简单地捕获 value 错误。

def main():
    try:
        num1 = int(sys.argv[1])
        num2 = int(sys.argv[2])
        num3 = int(sys.argv[3])
        avg = (num1 + num2 + num3)/3
        print("The average of " +str(num1) + " " + str(num2) + " " + str(num3) + " " + "is " + str(round(avg,2)))
    except ValueError:
        print("All your values need to be ints")

这将确保作为 arg 传入的数字以外的任何内容都会导致消息 All your values need to be ints

这不会捕获任何其他错误,因此您必须单独捕获它们。例如,您的第一个仅传递 2 个值的示例将不起作用,因为没有 num3,但我假设这不是您在此处询问的内容。

编辑:

用于检查强制输入 3 个数字,以及错误检查:

def main():
    
    if len(sys.argv) != 4:
        print("You did not enter the correct amount of arguments")
    else:
        try:
            num1 = int(sys.argv[1])
            num2 = int(sys.argv[2])
            num3 = int(sys.argv[3])
            avg = (num1 + num2 + num3)/3

            print(f"The average of {num1} {num2} {num3} is {round(avg, 2)}")

        except (UnboundLocalError, IndexError) as e:
            # When you don't pass any args
            print("You need to pass arguments")
            print(f"($ python avg.py 3 1 2)\n Error = {e}")
        except ValueError as e:
            # You need to use numbers
            print(f"You need to pass arguments as ints")
            print(f"(1 or 432. not 1.2, 324.0)\n Error = {e}")
            print(f"(1 or 432. not 1.2, 324.0)\n Error = {e}")

解释见下:


当有 3 个参数时,

len(sys.argv) 将是 4(尝试 print(sys.argv) 探索这个)

您可以使用 try 语句来捕获和 except 传递参数时的两个常见异常:

def main():
    try:
        num1 = int(sys.argv[1])
        num2 = int(sys.argv[2])
        num3 = int(sys.argv[3])
        avg = (num1 + num2 + num3)/3

        print(f"The average of {num1} {num2} {num3} is {round(avg, 2)}")

    except (UnboundLocalError, IndexError) as e:
        # When you don't pass any args
        print("You need to pass arguments")
        print(f"($ python avg.py 3 1 2)\n Error = {e}")
    except ValueError as e:
        # You need to use numbers
        print(f"You need to pass arguments as ints")
        print(f"(1 or 432. not 1.2, 324.0)\n Error = {e}")

try 将 运行 一个块,而 except 将 运行 当在 try 块中遇到列出的异常时(退出 try循环)。


您还可以将代码简化为:

nums = [int(x) for x in sys.argv[1:4]]
avg = sum(nums)/3

并使用

访问您的号码
# Same as nums1
nums[0] 

并将传入参数的长度更改为任何值>= 1(如果需要):

def main():
    try:

        nums = [int(x) for x in sys.argv[1:len(sys.argv)]]
        avg = sum(nums)/len(nums)

        print(f"The average of {', '.join([str(x) for x in nums])} is {round(avg, 2)}")

    except (UnboundLocalError, IndexError, ZeroDivisionError) as e:
        # When you don't pass any args
        print("You need to pass arguments")
        print(f"($ python avg.py 3 1 2)\n Error = {e}")
    except ValueError as e:
        # You need to use numbers
        print(f"You need to pass arguments as ints")
        print(f"(1 or 432. not 1.2, 324.0)\n Error = {e}")