'或'的解释在异常语法中,为什么它是有效的语法,它是如何工作的?

时间:2013-08-21 18:53:57

标签: python exception

我的一位同事错误地输入了这个(简化的)代码,并想知道为什么他的例外没有被抓住:

>>> 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是如何评估的,以及评估的内容是什么?!

感谢您可以放下任何光线!

2 个答案:

答案 0 :(得分:12)

这是因为IndexError or ValueError被评估为IndexError

>>> IndexError or ValueError
<type 'exceptions.IndexError'>

or运算符返回第一个求值为True的表达式(在本例中为IndexError),或者最后一个表达式,如果它们都不是True。<登记/> 因此,您的except语句实际上等同于:

except IndexError:

答案 1 :(得分:3)

布尔运算orand的结果始终是操作数之一,因此如果foo or bar为{{foofoo将评估为bar 3}},或foo if IndexError if falsy。

在这种情况下,ValueErrorIndexError or ValueError都是真实的,因此IndexError评估为except IndexError,而您的except语句等同于{{1}}。