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

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

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

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

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

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

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

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

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

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

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

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

Порядок 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 является единственным обработчиком, который проверяется.

См. также

Современные рекомендации по C++ по исключению и обработке ошибок