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):が、上記の構文が有効であると見なされるのはなぜですか? そして、それはどのように機能しますか?

たとえば、上記のコードは a をスローし、ValueErrorキャッチされません。ただし、次のコードを使用してください。

>>> 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オペランドの 1 つであるため、if is truey、またはif falsy にfoo or bar評価されます。foofoobarfoo

この場合、IndexErrorとの両方ValueErrorが true であるため、 とIndexError or ValueError評価されIndexError、except ステートメントは と同等except IndexErrorです。

于 2013-08-21T18:57:38.077 に答える