最近我遇到了一个从未见过的代码示例:
try:
# a simple bunch of code
if sample == 0:
return True
else:
raise ExampleError()
except not ExampleError:
raise AnotherExampleError()
它如何工作(如果可以的话)?
答案 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运算符始终会产生布尔值(True
或False
),因此它试图在此处捕获这些值之一,在这种情况下为False
。由于您无法抛出True
或False
,因此没有用。
我认为作者的意图是这样的:
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的类