最近,我遇到了一个我从未见过的代码示例:
try:
# a simple bunch of code
if sample == 0:
return True
else:
raise ExampleError()
except not ExampleError:
raise AnotherExampleError()它是如何工作的(如果工作的话)?
发布于 2019-05-10 12:56:41
编辑:下面的答案是Python 3,我没有意识到与Python2.7相关的问题。在Python2中,如果except后的表达式没有导致BaseException的子类型,解释器就不会抱怨。但是,这种行为仍然是错误的,在任何情况下都会忽略该except块。
这是一个有趣的结构,在语法上是有效的,但在语义上是错误的。我认为代码的作者表示的意思是“为除ExampleError以外的任何异常类型运行此except块”。然而,真正发生的事情更像是:
try:
# ...
except (not bool(ExampleError)):
# ...当在try块中引发异常时,Python会遍历不同的except块,寻找与异常类型匹配的异常。当它看到except not ExampleError (相当于except (not bool(ExampleError)) )时,它会导致except False,这是无效的,因为False不是BaseException的子类型(或BaseException的子类型的一个元组)。因此,如果没有引发异常,但代码是错误的,则代码甚至可能运行。
发布于 2019-05-10 13:09:57
据我所知,这在Python的任何版本上都不会成功。因为not操作符总是产生一个布尔值(True或False),所以这里试图捕捉其中的一个值,在这里是False。因为您不能抛出True或False,所以这是没有用的。
我认为作者的意图是这样的:
try:
raise ExampleError()
except ExampleError e:
throw e
except:
raise AnotherExampleError()发布于 2019-05-10 12:52:39
快速测试表明,如果代码到达该行,代码将抛出一个TypeError:
try:
raise BaseException
except not BaseException:
print("Test1")
except BaseException:
print("Test2")例外:
在处理上述异常的过程中,发生了另一个异常: 回溯(最近一次调用):文件"main.py",第3行,除了BaseException: TypeError:捕捉不从BaseException继承的类是不允许的
https://stackoverflow.com/questions/56078086
复制相似问题