Почему не исключает, что объект поймает все в Python?

Ссылка на язык python в раздел 7.4:

Для предложения except с выражением это выражение оценивается, и это предложение соответствует исключению, если результирующий объект "совместим" с исключением. Объект совместим с исключением, если это класс или базовый класс объекта исключения, или кортеж, содержащий элемент, совместимый с исключением.

Итак, почему except object: не улавливает все? object является базовым классом всех классов исключений, поэтому except object: должен улавливать каждое исключение.

Например, это должно поймать AssertionError

print isinstance(AssertionError(), object) # prints True
try:
    raise AssertionError()
except object:
    # This block should execute but it never does.
    print 'Caught exception'

Ответы

Ответ 1

Я считаю, что ответ можно найти в исходный код для python 2.7:

        else if (Py_Py3kWarningFlag  &&
                 !PyTuple_Check(w) &&
                 !Py3kExceptionClass_Check(w))
        {
            int ret_val;
            ret_val = PyErr_WarnEx(
                PyExc_DeprecationWarning,
                CANNOT_CATCH_MSG, 1);
            if (ret_val < 0)
                return NULL;
        }

поэтому, если w (я предполагаю, что выражение в выражении except) не является кортежем или классом исключений, а параметр Py_Py3kWarningFlag установлен, тогда попытка использовать недопустимый тип исключения в блоке исключений покажет предупреждение.

Этот флаг устанавливается добавлением флага -3 при выполнении вашего файла:

Tadhgs-MacBook-Pro:~ Tadhg$ python2 -3 /Users/Tadhg/Documents/codes/test.py
True
/Users/Tadhg/Documents/codes/test.py:5: DeprecationWarning: catching classes that don't inherit from BaseException is not allowed in 3.x
  except object:
Traceback (most recent call last):
  File "/Users/Tadhg/Documents/codes/test.py", line 4, in <module>
    raise AssertionError()
AssertionError