Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 发生异常时如何要求用户输入?_Python_Exception_Math - Fatal编程技术网

Python 发生异常时如何要求用户输入?

Python 发生异常时如何要求用户输入?,python,exception,math,Python,Exception,Math,我正在编写一个代码来解决二次公式,需要异常处理,以便丢失命令 检测到行参数。在除索引器外的块中:而不是退出 您应该使用input()程序询问用户缺少的输入数据。它不适用于以下代码。有人有什么想法吗 from math import sqrt import sys print('This program will solve the quadratic formula with given values, please enter below.') try: a=float(sys.a

我正在编写一个代码来解决二次公式,需要异常处理,以便丢失命令 检测到行参数。在
除索引器外的块中:
而不是退出 您应该使用
input()
程序询问用户缺少的输入数据。它不适用于以下代码。有人有什么想法吗

from math import sqrt
import sys

print('This program will solve the quadratic formula with given values, please enter below.')

try:
    a=float(sys.argv[1]) #first system argument
    b=float(sys.argv[2]) #second system argument 
    c=float(sys.argv[3]) #third system argument
    d=b**2-4*a*c #discriminant
    x1=((-b+sqrt(d))/2*a) #first solution
    x2=((-b-sqrt(d))/2*a) #second solution
except IndexError:
    raise IndexError(
        'Oops! Looks like you have not entered all values. Try again.') #request user input
    a=input(sys.argv[1]) #first system argument
    b=input(sys.argv[2]) #second system argument 
    c=input(sys.argv[3]) #third system argument
    d=b**2-4*a*c #discriminant
    x1=((-b+sqrt(d))/2*a) #first solution
    x2=((-b-sqrt(d))/2*a) #second solution
    
print(f'The quadratic formula with used a,b,c values gives two roots {x1:.2f} and {x2:.2f}')

我看到了几种改进原始代码的方法:

  • raise
    之后的语句永远不会执行
  • 通过
    float()
    转换字符串可能引发
    ValueError
  • 如果提供的参数少于3个,则
    sys.argv[n]
    将抛出错误
  • 您应该重新验证重新输入的输入,直到其正确
  • 如果以后的值出现问题,则不应触发正确值的重新输入
  • 如果判别式d为负,
    sqrt()
    将抛出一个
    ValueError
  • 通过分解验证逻辑,使您的代码变得干燥(不要重复)
  • 您需要一些方法来完成输出
以下代码通过以下方式修复这些问题:

  • 添加一个验证方法,使其更加干燥,并验证输入和处理
    ValueError
  • 通过迭代器按顺序处理3个参数,如果未提供,迭代器将返回“”,validate方法将处理该参数
  • 阴性鉴别测试

您正在catch块内引发un异常:

except IndexError:
  raise IndexError(
    'Oops! Looks like you have not entered all values. Try again.')
您可以删除它,并使用input()或类似工具提示用户此消息。例如:

except IndexError:

    a= input('Oops! Looks like you have not entered all values. Enter the value again.')

您捕获了异常并再次引发它。Remove
raise IndexError
sys.argv
是一个包含所有给定命令行参数的列表。如果在启动程序时没有给出正确的参数,那么一旦尝试处理异常,它们就不会神奇地出现。相反,可以考虑使用
input()
与用户交互。进入
except
块后,就可以使用
sys.argv
。您直接向用户询问价值。更简单的方法是退出程序,首先让用户传递正确的参数。使用
argparse
模块处理命令行参数(以及与此相关的错误)。在执行任何其他操作之前,请检查
sys.argv
的长度,并确保提供了正确数量的参数,如果没有,请使用
input()
获取它们)或打印错误消息并退出)。
except IndexError:

    a= input('Oops! Looks like you have not entered all values. Enter the value again.')