Assertion Error,不应该出现时的错误

Assertion Error, error when there shouldn't be one

try:
    guess = str(int(input("Please enter your guess: ")))
    assert len(guess) == 4
except ValueError or AssertionError:
    print("Please enter a 4 digit number as your guess not a word or a different digit number. ")

当我键入一个非 4 位数字时收到断言错误。

except ValueError or AssertionError: 应该是 except (ValueError, AssertionError):

当您执行 or 时,您没有捕捉到异常 AssertionError

我们来分析一下代码结构。我添加了括号来表示 Python 解释器组语句。

try:
    do_something()
except (ValueError or AssertionError):
    handle_error()

让我们检查一下捕获异常的定义发生了什么。引用 official docs:

The expression x or y first evaluates x; if x is true, its value is returned; otherwise, y is evaluated and the resulting value is returned.

"If x is true" 实际上是指 x 在布尔上下文中为真(x.__nonzero__() in Python 2, x.__bool__() 在 Python 3 中的值)。除非以其他方式实现,否则所有对象(包括 类)都是隐式真实的。

# No exception is raised in either case
assert ValueError
assert AssertionError
# both values after conversion are True
assert bool(ValueError) is True
assert bool(AssertionError) is True

考虑到 类 的布尔上下文和有关布尔运算的引用文档后,我们可以安全地假设 (ValueError or AssertionError) 的计算结果为 ValueError

要捕获多个异常,您需要将它们放在元组中:

try:
    do_something()
except (ValueError, AssertionError):
    handle_error()