首页 > 解决方案 > `try ... except not` 构造

问题描述

最近我遇到了一个我以前从未见过的代码示例:

try:
    # a simple bunch of code
    if sample == 0:
        return True
    else:
        raise ExampleError()
except not ExampleError:
    raise AnotherExampleError()

它是如何工作的(如果可以的话)?

标签: pythonpython-2.7exceptiontry-catch

解决方案


编辑:下面的答案是针对 Python 3,我没有意识到与 Python 2.7 相关的问题。在 Python 2 中,看起来,如果表达式 afterexcept没有产生BaseException. 但是,该行为仍然是错误的,它except在所有情况下都会忽略该块。


这是一个有趣的结构,在语法上是有效的,但在语义上是错误的。我想代码的作者的意思是表达类似“except为任何异常类型运行此块,但ExampleError”。然而,真正发生的事情更像是:

try:
    # ...
except (not bool(ExampleError)):
    # ...

当块中出现异常时try,Python 会遍历不同的except块来寻找与异常类型匹配的块。当它看到except not ExampleError,等价于 时except (not bool(ExampleError)),它会导致except False,这是无效的,因为False它不是 的子类型BaseException(或子类型的元组BaseException)。因此,如果没有引发异常但错误的代码甚至可以运行。


推荐阅读