【问题标题】:How can I get print except statement printed instead of an error below in try/except syntax in Python如何在 Python 中的 try/except 语法中打印除语句而不是下面的错误
【发布时间】:2020-05-30 03:58:57
【问题描述】:

我是 Python 编程新手。以下是编写的代码,当我打印任何数字并按预期给我所需的结果时它工作正常,但是当我输入字符串(除整数/浮点数以外的任何内容)而不是只给我除了语句时,问题就来了,它也给了我一个我不想要的错误。所以,我想要的是当用户输入除数字以外的任何内容时,应该提示他一条消息,即“输入无效。请输入一个数字”,而不是我在最后的除了打印语句之后得到的错误.请帮忙。

hours_string = input("Enter Hours: ")
rate_string = input("Enter Rate: ")
try:
    hours_float = float(hours_string)
    rate_float = float(rate_string)
except:
    print("Invalid input. Enter a number please.")

result = hours_float * rate_float
print("Pay",result)

这是我得到的错误。如果我输入字符串,我应该只得到一个 except 语句。而已。没有任何其他错误。我怎样才能到达那里?

Enter Hours: 9
Enter Rate: entered string by mistake
Invalid input. Enter a number please.
Traceback (most recent call last):
  File "<string>", line 9, in <module>
NameError: name 'rate_float' is not defined

【问题讨论】:

  • 当您点击except 时,它不会返回并再次询问小时数和费率。因此,rate_float 从未真正被分配。
  • 尝试使用try/except/else
  • 你能告诉我如何在我的场景中做到这一点吗?将不胜感激!发布答案的人不适合我。它向我显示了同样的错误。
  • 我接受了 Tomerikoo 的建议,并使其适合您@Fiona Daniel

标签: python


【解决方案1】:

对于特定的错误,您可以执行特定的 Exeption,如下面的代码所示。另请注意,每个问题都在一个 whileloop 中,您需要在进入下一个问题之前完成任务。

while True:
    try:
        hours_string = input("Enter Hours: ")
        hours_float = float(hours_string)
    except ValueError:
        print("Invalid input. Enter a number please.")
    else:
        break
while True:        
    try:
        rate_string = input("Enter Rate: ")
        rate_float = float(rate_string)
    except ValueError:
        print("Invalid input. Enter a number please.")
    else:
        break

result = hours_float * rate_float
print("Pay",result)

【讨论】:

  • 这如何以任何方式回答所提出的问题? NameError 没有出现在 try 块中,而是出现在第 9 行,在 except 已经执行之后。使异常更具体绝对不能解决 OP 的问题。
  • 他想给用户一个提示他做错了什么。当然可以有更多的例外,也许它需要在某些步骤中拆分代码,但我认为他明白了。如果他需要更多支持,他可以提出要求。
  • @Atlas435 您是否尝试在编辑后运行此新代码?程序应该如何退出第一个 while True: 循环?条件将始终为True,因此它将无限运行,除非某些未捕获的异常过早终止它。
  • @MihaiChelaru 再次编辑。谢谢你的提示,我不介意。
  • @Atlas435 非常感谢。我有个问题。如何以函数形式解决这个问题?喜欢 def 函数吗?
【解决方案2】:
hours_float = None
rate_float = None

while hours_float is None:
    hours_string = input("Enter Hours: ")
    try:
        hours_float = float(hours_string)
    except ValueError:
        print("Invalid input. Enter a number please.")

while rate_float is None:
    rate_string = input("Enter Rate: ")
    try:
        rate_float = float(rate_string)
    except ValueError:
        print("Invalid input. Enter a number please.")

result = hours_float * rate_float
print("Pay", result)

while 循环中,我们反复要求用户输入,但他们没有输入有效数字,分别输入小时数和费率。

有效输入将初始设置的None 值更改为其他值,从而完成相应的循环。

【讨论】:

  • 非常感谢。如果您输入几个小时的字符串然后它应该直接让您打印它是无效输入而不是移动用户提示输入的速率,您如何实现此目标?
  • 而这个问题如何以函数形式解决呢?喜欢 def 函数吗?
【解决方案3】:

由于这是一种预期的情况,并且可以将其视为测试,我建议您不要尝试使用用户提供的任何输入来执行操作,您可以要求用户输入并且它不是您要求的整数再次输入。

def get_input(name, var_type):
  userin = None
  while userin is None:
    userin = input(f'Input {name}: ')
    try:
      userin = var_type(userin)
    except ValueError:
      print(f'{name} must be {str(var_type)}, not {str(type(userin))}')
      userin = None
  return userin


hours = get_input('hours', int)
rate = get_input('rate', float)

result = hours * rate
print('Pay', result)

函数get_input 尝试将输入输入值强制转换为您想要的类型,如果不符合要求,它将继续询问直到类型匹配。

【讨论】:

  • 非常感谢。如果您输入几个小时的字符串然后它应该直接让您打印它是无效输入而不是移动用户提示输入的速率,您如何实现此目标?
  • 好吧,我正在设置变量userin = None,虽然它不是我想要的,但它会一直要求它。请注意,如果结果不是预期的,while userin is None 将继续运行代码,然后var_type(userin) 正在尝试将intfloat 类型转换为变量。如果转换成功,该函数将返回用户输入,如果不是,则将值 None 再次分配给 usering 变量,这样它就不会离开 while 循环。
猜你喜欢
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 2018-06-18
相关资源
最近更新 更多