我的一个同事错误地输入了这个(简化的)代码,并且想知道为什么他的异常没有被捕获:
>>> try:
... raise ValueError
... except IndexError or ValueError:
... print 'Caught!'
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ValueError
现在我知道捕获这两种类型异常的正确语法应该是except (IndexError, ValueError):
,但是为什么上面的语法被认为是有效的呢?它是如何工作的?你知道吗
例如,上面的代码将抛出一个ValueError
,它不会被捕获。但以这个代码为例:
>>> try:
... raise IndexError
... except IndexError or ValueError:
... print 'Caught!'
...
Caught!
IndexError
会被抓到。如何评估or
,评估结果是什么?!你知道吗
谢谢你的帮助!你知道吗
那是因为
IndexError or ValueError
被计算为IndexError
。你知道吗or
运算符返回计算结果为True
(在本例中为IndexError
)的第一个表达式,或者返回最后一个表达式(如果它们都不是True
)。所以,你的except语句实际上等于:
布尔运算的结果
or
和and
始终是其中一个操作数,因此foo or bar
将计算为foo
(如果foo
是truthy),或者bar
(如果foo
是falsy)。你知道吗在这种情况下,
IndexError
和ValueError
都是真的,所以IndexError or ValueError
的计算结果是IndexError
,并且您的except语句等价于except IndexError
。你知道吗相关问题 更多 >
编程相关推荐