首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“”试试.除非构造外

“”试试.除非构造外
EN

Stack Overflow用户
提问于 2019-05-10 12:49:23
回答 3查看 189关注 0票数 7

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

代码语言:javascript
复制
try:
    # a simple bunch of code
    if sample == 0:
        return True
    else:
        raise ExampleError()
except not ExampleError:
    raise AnotherExampleError()

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-10 12:56:41

编辑:下面的答案是Python 3,我没有意识到与Python2.7相关的问题。在Python2中,如果except后的表达式没有导致BaseException的子类型,解释器就不会抱怨。但是,这种行为仍然是错误的,在任何情况下都会忽略该except块。

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

代码语言:javascript
复制
try:
    # ...
except (not bool(ExampleError)):
    # ...

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

票数 8
EN

Stack Overflow用户

发布于 2019-05-10 13:09:57

据我所知,这在Python的任何版本上都不会成功。因为not操作符总是产生一个布尔值(TrueFalse),所以这里试图捕捉其中的一个值,在这里是False。因为您不能抛出TrueFalse,所以这是没有用的。

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

代码语言:javascript
复制
try:
    raise ExampleError()
except ExampleError e:
    throw e
except:
    raise AnotherExampleError()
票数 3
EN

Stack Overflow用户

发布于 2019-05-10 12:52:39

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

代码语言:javascript
复制
try:
  raise BaseException
except not BaseException:
  print("Test1")
except BaseException:
  print("Test2")

例外:

在处理上述异常的过程中,发生了另一个异常: 回溯(最近一次调用):文件"main.py",第3行,除了BaseException: TypeError:捕捉不从BaseException继承的类是不允许的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56078086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档