8

我的一位同事错误地输入了这个(简化的)代码,并且想知道为什么他的异常没有被捕获:

>>> try:
...     raise ValueError
... except IndexError or ValueError:
...     print 'Caught!'
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError

现在我知道捕获这两种异常的正确语法应该是except (IndexError, ValueError):,但为什么上面的语法被认为是有效的?它是如何工作的?

例如,上面的代码会抛出 aValueError并且不会被捕获。但请使用以下代码:

>>> try:
...     raise IndexError
... except IndexError or ValueError:
...     print 'Caught!'
... 
Caught!

IndexError被抓住。评估如何or,评估到什么?!

感谢您提供的任何光线!

4

2 回答 2

12

那是因为IndexError or ValueError被评估为IndexError.

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

or运算符返回计算结果为True( 在这种情况下)的IndexError第一个表达式,或最后一个表达式,如果它们都不是True
因此,您的 except 语句实际上等同于:

except IndexError:
于 2013-08-21T18:55:42.917 回答
3

布尔运算的结果,or并且and始终是操作数之一,因此foo or bar将评估为fooif foois truthybarif fooif falsey。

在这种情况下,IndexErrorandValueError都是真实的,因此IndexError or ValueError评估为IndexError,并且您的 except 语句等效于except IndexError

于 2013-08-21T18:57:38.077 回答