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