Проверка блоков Catch (C++)

C++ позволяет создавать исключения любого типа, хотя обычно рекомендуется создавать типы, производные от std::exception. Исключение в C++ может быть перехвачено обработчиком catch, в котором определен тот же тип, что и у созданного исключения, или обработчиком, который способен перехватывать любой тип исключения.

Если созданное исключение имеет тип класса, у которого имеется один или несколько базовых классов, то его могут перехватывать обработчики, которые принимают базовые классы (и ссылки на базовые классы) этого типа исключения. Обратите внимание, что если исключение перехватывается по ссылке, то оно привязывается к самому объекту исключения; в противном случае обрабатывается его копия (как и в случае с аргументами функции).

Созданное исключение может перехватываться следующими типами обработчиков catch:

  • Обработчик, который может принимать любой тип данных (синтаксис с многоточием).

  • Обработчик, который принимает тот же тип, что и у объекта исключения; поскольку используется копия объекта, то модификаторы const и volatile игнорируются.

  • Обработчик, который принимает ссылку на тот же тип, что и у объекта исключения.

  • Обработчик, который принимает ссылку на форму const или volatile того же типа, что и у объекта исключения.

  • Обработчик, который принимает базовый класс того же типа, что и у объекта исключения; поскольку используется копия объекта, то модификаторы const и volatile игнорируются. Обработчик catch для базового класса не должен предшествовать обработчику catch для производного класса.

  • Обработчик, который принимает ссылку на базовый класс того же типа, что и у объекта исключения.

  • Обработчик, который принимает ссылку на форму const или volatile базового класса того же типа, что и у объекта исключения.

  • Обработчик, который принимает указатель, в который можно преобразовать созданный объект указателя при помощи стандартных правил преобразования указателей.

Порядок, в котором располагаются обработчики catch, имеет значение, поскольку обработчики для конкретного блока try проверяются в порядке их следования. Например, ошибкой будет поместить обработчик для базового класса перед обработчиком для производного класса. После того как программа обнаружит подходящий обработчик catch, все последующие обработчики не проверяются. Таким образом, обработчик catch с многоточием должен быть последним обработчиком для своего блока try. Например:

// ...
try
{
    // ...
}
catch( ... )
{
    // Handle exception here.
}
// Error: the next two handlers are never examined.
catch( const char * str )
{
    cout << "Caught exception: " << str << endl;
}
catch( CExcptClass E )
{
    // Handle CExcptClass exception here.
}

В этом примере будет проверен только обработчик catch с многоточием.

См. также

Ссылки

Обработка исключений С++