python - `try ... except not` 构造
问题描述
最近我遇到了一个我以前从未见过的代码示例:
try:
# a simple bunch of code
if sample == 0:
return True
else:
raise ExampleError()
except not ExampleError:
raise AnotherExampleError()
它是如何工作的(如果可以的话)?
解决方案
编辑:下面的答案是针对 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
)。因此,如果没有引发异常但错误的代码甚至可以运行。
推荐阅读
- javascript - 无法调用返回数组以在全日历中设置事件的函数
- r - 如何使用 R 在文本文件中写入一个绝对有一个反斜杠的字符串?
- c# - 如何使用二进制掩码查找边界体素(像素),以仅获取段表面
- python - 如何遍历字典形状 .txt 文件以创建 DataFrame
- javascript - 浏览器中的东部计算给出了错误的 2021 年数字
- c++ - 如何复制具有动态内存分配数据成员的 C++ 对象
- c - 当 MSB 位等于 0 时如何以 HEX 格式打印
- c++ - std::thread Args... 列表中的函数指针
- javascript - 如何在 typescript/react 中访问 JSX 组件之外的变量?
- .net - 从桌面发布后,Azure 管道 Blazor WASM 不会传播更改