首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当发生异常时,如何要求用户输入?

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

Stack Overflow用户
提问于 2020-09-20 23:14:13
回答 2查看 158关注 0票数 1

我正在编写一个代码来解决二次公式,需要异常处理,以便检测丢失的命令行参数。在except IndexError:块中,您应该使用input()向用户询问缺少的输入数据,而不是退出程序。它不能与以下代码一起工作。有谁有什么想法吗?

代码语言:javascript
复制
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}')
EN

回答 2

Stack Overflow用户

发布于 2020-09-21 01:22:24

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

跟在判别式后面的

  • 语句从来不是字符串的ValueError

  • If通过float()可能抛出一个小于3个参数的错误,然后sys.argv[n]将抛出一个错误,您应该重新验证重新输入的输入,直到它是正确的。

  • 如果后面的值有问题,您不应该触发重新输入正确的值。

  • 如果您的判别式d为负,sqrt()会通过分解验证逻辑抛出一个ValueError

  • Make your code DRY (不要重复自己)

  • 你需要一些方法来做输出。

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

为负discriminant.添加验证方法以使其更加干练,并验证输入,并通过迭代器按顺序处理3个参数,该迭代器将返回“”,

  • 方法将处理该迭代器。
  • discriminant.

代码语言:javascript
复制
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")
票数 1
EN

Stack Overflow用户

发布于 2020-09-21 03:21:13

您在catch块中引发了一个异常:

代码语言:javascript
复制
except IndexError:
  raise IndexError(
    'Oops! Looks like you have not entered all values. Try again.')

您可以删除它,并使用input()或类似的方法提示用户此消息。例如:

代码语言:javascript
复制
except IndexError:

    a= input('Oops! Looks like you have not entered all values. Enter the value again.')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63980502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档