Объяснение «или» в синтаксисе исключений, почему это допустимый синтаксис и как он работает?

Мой коллега ошибочно набрал этот (упрощенный) код и задавался вопросом, почему его исключение не попало:

>>> 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 будет пойман. Как оценивается и оценивается?

Спасибо за любой свет, который вы можете сбросить!

2 Solutions collect form web for “Объяснение «или» в синтаксисе исключений, почему это допустимый синтаксис и как он работает?”

Это потому, что IndexError or ValueError оценивается в IndexError .

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

Оператор or возвращает первое выражение, которое оценивает значение True (в данном случае IndexError ) или последнее выражение, если ни одно из них не является True .
Итак, ваш оператор except фактически эквивалентен:

 except IndexError: 

Результат булевых операций or и всегда является одним из операндов, поэтому foo or bar будет оценивать foo если foo является правдивым , или bar если foo если ложь.

В этом случае как IndexError и ValueError являются правдивыми, поэтому IndexError or ValueError вычисляет IndexError , а ваш оператор except эквивалентен except IndexError .

  • Проверьте, что поток python выбрал исключение
  • Кто бросает (и ловит) это исключение MySQL?
  • Ошибки с модулем механизации Python
  • Как обращаться с FileNotFoundError, когда «try ... except IOError» не поймает его?
  • Руководство по исключениям, предоставленным документами Python
  • Обработка исключения Python, которое встречается в предложении except
  • Как отключить "sys.excepthook отсутствует" ошибка?
  • Как получить полную трассировку стека исключений в Python
  • Какую строку выбрать для исключения в исключении
  • python selenium webscraping «NoSuchElementException» не распознается
  • Python: Как игнорировать исключение и продолжить?
  • Python - лучший язык программирования в мире.