我的一位同事错误地输入了这个(简化的)代码,并想知道为什么他的例外没有被抓住:
>>> 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
是如何评估的,以及评估的内容是什么?!
感谢您可以放下任何光线!
答案 0 :(得分:12)
这是因为IndexError or ValueError
被评估为IndexError
。
>>> IndexError or ValueError
<type 'exceptions.IndexError'>
or
运算符返回第一个求值为True
的表达式(在本例中为IndexError
),或者最后一个表达式,如果它们都不是True
。<登记/>
因此,您的except语句实际上等同于:
except IndexError:
答案 1 :(得分:3)
布尔运算or
和and
的结果始终是操作数之一,因此如果foo or bar
为{{foo
,foo
将评估为bar
3}},或foo
if IndexError
if falsy。
在这种情况下,ValueError
和IndexError or ValueError
都是真实的,因此IndexError
评估为except IndexError
,而您的except语句等同于{{1}}。