Поделиться через


Как блоки catch вычисляются (C++)

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

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

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

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

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

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

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

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

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

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

См. также

Ссылки

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