【问题标题】:catching an input errorr捕获输入错误
【发布时间】:2019-10-01 18:40:08
【问题描述】:

我做了一个简单的计算器,我试图用 try 和 except 函数来捕捉错误,但由于某种原因它没有捕捉到错误。错误是当我在 num1 或 num2 输入中输入除数字以外的任何内容时。我收到一个 ValueError,但我将 ValueError 放在了 except 块中,但它仍然没有捕获它。我希望它捕获错误并打印无效数字,而不是在 pycharm 中实际给我一个错误。

num1 = float(input("give a number"))
op = input("give an operator")
num2 = float(input("give a number"))


try:
    if op == "/":
     print(num1/num2)
    elif op == "*":
     print(num1*num2)
    elif op == "-":
     print(num1-num2)
    elif op == "+":
     print(num1+num2)
    else:
     if op != "/*-+":
         print("invalid operator")
except ValueError:
    print("invalid number")

这是它给我的错误

give a number+
Traceback (most recent call last):
  File "C:/Users/Kalen/PycharmProjects/m/m.py", line 3, in <module>
    num1 = float(input("give a number"))
ValueError: could not convert string to float: '+'

【问题讨论】:

  • FWIW,if op != "/*-+" 应该是 if op not in "/*-+"
  • 您正在获取输入并尝试在进入任何验证块之前将其转换为浮点数。您需要更改订单
  • 当你的程序说“给一个数字”时,你给了它一个加号,那个加号不是一个数字,不能转换成float
  • 如果我把 if op not 放在 "/*-+" 而不是 if op != "/*-+" 有什么区别?我复制并粘贴了 num1/op/num2 变量并将它们放在 try 和 except 块中,现在它可以按照我的意愿工作,谢谢 G.Anderson

标签: python pycharm try-catch except


【解决方案1】:
num1 = input("give a number")
op = input("give an operator")
num2 = input("give a number")

try:
    num1=float(num1)
    num2=float(num2)
    if op == "/":
     print(num1/num2)
    elif op == "*":
     print(num1*num2)
    elif op == "-":
     print(num1-num2)
    elif op == "+":
     print(num1+num2)
    else:
     if op != "/*-+":
         print("invalid operator")
except ValueError:
    print("invalid number")

试试这个,希望它能按预期工作。

【讨论】:

    【解决方案2】:

    您正试图在 catch 块之前将输入强制转换为浮点数,因此错误出现在 catch 块之前并且未被捕获。在 catch 块之外读取输入,但稍后仅在 catch 块内将它们转换为浮点数。

    更好的是,先检查字符串是否真的是数字,而不是尝试强制转换和抛出 ValueErrors。使用string.isdigit() 执行此操作。

    通过抛出和捕获异常来验证输入是不好的做法。一般的建议是检查和验证你可以合理预期的各种情况,只在你无法预见的情况下捕获和抛出异常。当您编写 try-catch 子句时,您假设某些错误可能由于某些原因超出您的控制范围而发生,但您不知道原因、位置或方式。抛出异常是针对错误,而不仅仅是针对正常可预见的程序流程。

    if not (num1.isdigit() and num2.isdigit()):
          print("invalid number")
    else:
          // proceed
    
    
    

    【讨论】:

      猜你喜欢
      • 2011-09-12
      • 2010-10-31
      • 2011-10-04
      • 2010-10-02
      • 2013-05-11
      • 1970-01-01
      • 2013-08-07
      • 2020-01-08
      • 2016-06-18
      相关资源
      最近更新 更多