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

2024-06-02 09:01:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个代码来解决二次公式,需要异常处理,以便丢失命令 检测到行参数。在except IndexError:块中,而不是退出 您应该使用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}')

Tags: 代码inputsyssqrtfloatargumentsystemfirst
2条回答

您正在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.')

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

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

以下代码通过以下方式修复这些问题:

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

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

def validate(name, value):
    try:
        return float(value)
    except ValueError:
        new_value = input(f"Entered a value for {name}: ")
        return validate(name, new_value)

args = iter(sys.argv)
a = validate('a', next(args, ''))
b = validate('b', next(args, ''))
c = validate('c', next(args, ''))
d=b**2-4*a*c #discriminant
if d >= 0 :
    x1=((-b+sqrt(d))/2*a) #first solution
    x2=((-b-sqrt(d))/2*a) #second solution
    print(f"the roots {x1} and {x2}")
else:
    print("the equation has no real-valued solutions")

相关问题 更多 >