【问题标题】:I am trying to prevent an error if the user tries to divide 10/'dog'. Even after using exception I still get error如果用户尝试除以 10/'dog',我试图防止出现错误。即使在使用异常后我仍然得到错误
【发布时间】:2021-04-30 20:55:54
【问题描述】:

Still getting Type and Value Error

def my_divider(a,b):         
    try:return a/b 
    
    except ZeroDivisionError:
        return"Error: You cannot divide a number by 0"
    
    except TypeError:         
        a=float(a)
        b=float(b)
        return a/b
    
    except ValueError:
        return"Please enter an integer"
  
var1=10
var2='dog'
print(my_divider(var1,var2))

【问题讨论】:

  • 请在此处发布您的实际代码,而不仅仅是图片链接。
  • 请发布您的代码,而不是图片。

标签: python typeerror valueerror


【解决方案1】:

我会回应 @dkamins 在这里所说的,但我需要代表,所以我会在这里试一试。

你正在编写的代码看起来如此接近,当你看到它时,你会踢自己。很好地使用了 try except 子句!你看起来已经像个 python 专业人士了。是的,当您尝试在 isinstance(b,str) 时分配 b = float(b) 时会发生错误,但我认为,您试图捕获该异常。但由于它与 separate try-except 子句内联,因此它的行为与您所看到的一样。所以,类似:

def my_divisor(a,b):

  try:

    return a/b

  except ZeroDivisionError:

    print("You cannot divide by the number 0")

    return None
  
  except TypeError:

    try:

      a = float(a)
      b = float(b)

      return a/b

    except ValueError:

      print('Error converting type of a, b to numeric. Just put in some numbers, pls')

      return None

小心!!!我们在这里没有处理任何事情。 my_divisor(40,"0") 会返回什么?我想你是从这里得到的朋友!

【讨论】:

    【解决方案2】:

    您正在捕捉TypeError,这是正确的。如果您从此except 块返回一些字符串,您的程序将毫无问题地运行并打印返回的字符串。但是您通过将dog 转换为string 来提高另一个ValueError

    请记住,所有这些 except 块都用于一个 try 块。如果我在处理第一个异常时导致另一个异常,你正在尝试做的是可以的,我将编写另一个 except 块,这将不起作用。您将不得不编写另一个 try-except 块。

    【讨论】:

    • 是的,但这太复杂了。你到底想要什么?
    • 你想输入一个整数?那你为什么要转换成float?你想一直问直到用户输入一个整数?
    • 您可以在try 块内写入return float(a) / float(b),这样您就可以捕获ValueError 以及TypeError 并采取相应的行动。
    • 谢谢。代码需要重组,我不得不像你说的那样添加一个 try 块
    【解决方案3】:

    首先,请将您的代码粘贴到问题中。

    在您的情况下,TypeError 正在触发,但是您在调用 float('dog') 时会导致次要 ValueError 异常。

    要解决此问题,您必须首先决定在这种情况下您希望发生什么。

    【讨论】:

    • 继续尝试,代码看起来很奇怪抱歉。
    • 我希望它只是告诉用户“输入一个整数”
    • 然后你需要重构你的代码循环输入+计算+打印直到它成功。异常处理程序无法完成这项工作。它只会捕获异常(并可能打印错误),因此包含循环将知道再次运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 2021-01-29
    • 2022-11-13
    • 2017-09-05
    相关资源
    最近更新 更多