尝试...除非不是

时间:2019-05-10 12:49:23

标签: python python-2.7 exception try-catch

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

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

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

3 个答案:

答案 0 :(得分:8)

编辑:以下答案是针对Python 3的,我没有意识到与Python 2.7相关的问题。在Python 2中,看起来except之后的表达式没有导致BaseException的子类型,解释器不会抱怨。但是,该行为仍然是错误的,它只会在所有情况下都忽略except块。


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

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

try块中引发异常时,Python会通过不同的except块来寻找与异常类型匹配的块。当它看到except not ExampleError时,与except (not bool(ExampleError))等效,结果为except False,这是无效的,因为False不是BaseException的子类型(也不是{ BaseException的子类型)。因此,如果没有引发异常但错误,代码甚至可以运行。

答案 1 :(得分:3)

据我所知,这在任何版本的Python上都不会成功。由于not运算符始终会产生布尔值(TrueFalse),因此它试图在此处捕获这些值之一,在这种情况下为False。由于您无法抛出TrueFalse,因此没有用。

我认为作者的意图是这样的:

try:
    raise ExampleError()
except ExampleError e:
    throw e
except:
    raise AnotherExampleError()

答案 2 :(得分:1)

快速测试表明,如果代码到达该行,它将抛出TypeError

try:
  raise BaseException
except not BaseException:
  print("Test1")
except BaseException:
  print("Test2")

例外:

  

在处理上述异常期间,发生了另一个异常:

     

回溯(最近一次通话最后一次):文件“ main.py”,第3行,在          除了不是BaseException:TypeError:不允许捕获不继承自BaseException的类