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

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

>>> 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?
  • поднимать без аргументов
  • Python - тест, который преуспевает, когда исключение не возникает
  • почему мы должны использовать Exception в качестве суперкласса, почему не BaseException
  • Зачем возвращать NotImplemented вместо повышения NotImplementedError
  • Распечатайте иерархию исключений / ошибок Python
  • Как «с» лучше, чем try / catch, чтобы открыть файл в Python?
  • Исключение Python 3 удаляет переменную в закрывающей области по неизвестной причине
  • Обработка исключений SQL-ограничений в Odoo ORM
  • Python - лучший язык программирования в мире.