【问题标题】:What's wrong with this try/ except block in Python?Python 中的 try/except 块有什么问题?
【发布时间】:2017-10-12 23:10:13
【问题描述】:
    try:
        user_name = str(input("Enter your full name: "))
    except:
        print("Enter a string")

    user_age = int(input("Enter your age: "))
    user_country = str(input("Enter the country you live in: "))
    user_postcode = str(input("Enter your postcode: "))

当我为第一个输入一个整数时,它会移动到下一个变量,但我希望它说“输入一个字符串”

【问题讨论】:

  • 输入已经返回一个字符串
  • 读成try <this> and continue except when it screws up with <exception> do this instead 可能会有所帮助。由于块中的所有内容都是字符串,因此它永远不会搞砸。

标签: python try-except


【解决方案1】:

Any 输入已经是一个字符串。当您读取一个整数(例如 123)时,输入以字符串形式出现(例如“123”)。将其转换为 str 什么也不做。您需要更具体地了解您期望的输入内容,并测试那个

例如,您可能想要确定所有字符都在一个特定的集合中——例如字母、空格和某些标点符号。然后,您需要针对这些特征编写一两个特定的测试。

【讨论】:

    【解决方案2】:

    input 的返回类型始终是str 的实例。即使用户输入看似数字的内容,结果仍然是包含该数字的字符串。例如如果他们输入5,它仍然以字符串'5' 的形式提供给您。

    因此,您需要做的是检查它是否为整数。

    例如

    user_name = input("Enter your full name: ")
    try:
        int(user_name)
    except ValueError:
        pass
    else:
        print("Enter a string")
    

    上面的代码首先将输入读入一个变量,这总是一个字符串。然后它尝试使用int() 方法将其转换为整数。如果转换失败(这是我们想要的)。我们只是照常进行(使用pass)。否则它将点击else 并打印我们的消息。

    【讨论】:

      【解决方案3】:

      我想您想测试名称中是否有数字: 你可以这样做:

      while True:
          user_name = str(input("Enter your full name: "))
          if [i for i in list(user_name) if i.isdigit()]:
              print("invalid input")
          else:
              break
      

      或者最好检查所有输入是否都是字母表中的字母:

      alphabet = list("abcdefghijklmnopqrstuvwxyz")
      
      while True:
          errors = 0
      
          user_name = str(input("Enter your full name: "))
          for i in user_name.split(" "):
              for ii in i:
                  if ii not in alphabet:
                      errors += 1
      
          if errors:
              print("You have {} errors".format(errors))
          else:
              break
      

      【讨论】:

        【解决方案4】:

        try-except 的 except-part 仅在 try-part 中的内容引发错误时运行。

        一个例子是被零整除。以下代码尝试在 python shell 中运行时会抛出错误;

        print(5/0)
        

        您可以捕获此错误,并打印您自己的消息,而不是 python shell 打印自己的消息。在这种情况下,ZeroDivisionError 是 python 将抛出的特定类型的错误。使用以下代码,python 只会捕获该错误,而不是任何其他错误。

        try:
             print(5/0)
        except ZeroDivisionError:
             print("Cannot divide by zero")
        

        如果您想捕获所有错误,只需编写 except 而不是 except zeroDivisionError

        except-block 内的代码不会运行,因为在尝试运行 try-block 内的内容时没有错误。 try 块内部发生的事情只是将输入分配给变量。此行没有引发错误,因此except-block 不会运行。

        有不同的方法来获得你想要的功能。您可能想重复输入必须是字符串,直到用户实际输入字符串。您可以使用while-loop 做到这一点。如果字符串到整数转换失败,则抛出的特定错误是ValueError

        isString = False
        while not isString:
              userInput = input("Enter here: ")
        
              try:
                   int(userInput)
              except ValueError:
                   # if string to integer fails, the input is a string
                   isString = True
              else:
                    print("Please enter a string")
        

        只要isStringFalse,上面的while 循环就会运行。首先我们尝试从字符串转换为整数。如果这引发错误,则输入是一个字符串,因此我们将 isString 设置为True,while 循环将不再运行。如果转换成功,则意味着输入实际上是一个整数,因此 else 语句将运行,打印用户需要输入一个字符串。

        【讨论】:

          猜你喜欢
          • 2021-07-14
          • 1970-01-01
          • 1970-01-01
          • 2021-04-04
          • 2019-06-26
          • 2018-03-19
          • 2022-11-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多