ValueError 仍然存在于 except 语句中

ValueError Still Present with Except Statement

我正在尝试创建一个程序来探索 collat​​z 序列。它一直有效,直到我尝试添加 tryexcept 语句以确保用户输入数字而不是文本。下面是代码:

def collatz(number):
    try:
        if number % 2 == 0:
            print(number // 2)
            return number // 2
        elif number % 2 == 1:
            result = 3 * number + 1
            print(result)
            return result
    except ValueError:
        print('That is not a number')

print('Enter a number')
n = int(input())

while n != 1:
    n = collatz(int(n))

如果我输入数字,我可以 运行 它没有问题。但是,当我输入 "puppy" 这个词时,我遇到了这个:

Traceback (most recent call last):
  File "C:/Users/kredeker/Desktop/python/collatz2.py", line 14, in <module>
    n = int(input())
ValueError: invalid literal for int() with base 10: 'puppy'

我以为我是用这个来解释 ValueError 的:

except ValueError:
    print('That is not a number')

您在 n = int(input()) 收到错误!

所以尝试做

try:
  n = int(input())
except ValueError:
  print('That is not a number')

完整代码(这样你就不会在 'n' 时出错):

def collatz(number):
    if number % 2 == 0:
        print(number // 2)
        return number // 2
    elif number % 2 == 1:
        result = 3 * number + 1
        print(result)
        return result

print('Enter a number')

try:
  n = int(input())
  while n != 1:
    n = collatz(n)
except ValueError:
  print('That is not a number')

try...except 仅适用于这些词之间 运行 的代码,包括函数调用。如回溯所示,您的异常发生在第 14 行:

n = int(input())  # <---

这是由于您输入的字符串 (puppy) 无法解释为以 10 为底的整数。

您需要将其包装在 try ... except 中;但更好的选择是采用并改编 this excellent answer.

中的函数