异常语法中“or”的解释,为什么它是有效语法,它是如何工作的?

2024-10-03 04:36:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

>>> 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,评估结果是什么?!你知道吗

谢谢你的帮助!你知道吗


Tags: or代码most错误语法raiseprinttry
2条回答

那是因为IndexError or ValueError被计算为IndexError。你知道吗

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

or运算符返回计算结果为True(在本例中为IndexError)的第一个表达式,或者返回最后一个表达式(如果它们都不是True)。
所以,你的except语句实际上等于:

except IndexError:

布尔运算的结果orand始终是其中一个操作数,因此foo or bar将计算为foo(如果footruthy),或者bar(如果foo是falsy)。你知道吗

在这种情况下,IndexErrorValueError都是真的,所以IndexError or ValueError的计算结果是IndexError,并且您的except语句等价于except IndexError。你知道吗

相关问题 更多 >