Шаг 4.
Синтаксис и семантика генерации и обработки исключений (окончание)

    На этом шаге мы подведем итог изучению вопросов, связанных с минтаксисом и семантикой генерации и обработки исключений.

    Продолжим рассмотрение правил обработки исключений.

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

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

    При поиске обработчика, пригодного для "обслуживания" исключения, оно последовательно сравнивается по типу со спецификациями исключений, помещенными в скобках после служебных слов catch. Спецификации исключений подобны спецификациям формальных параметров функций, а набор обработчиков исключений подобен совокупности перегруженных функций. Если обработчик исключений (процедура обработки) имеет вид:

    catch   (T х)   {   действия_обработчика  }

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

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

    catch   (В х)   {  действия_обработчика  } 

также соответствует этому исключению.

    На следующем шаге мы рассмотрим более подробно генерацию исключений.




Предыдущий шаг Содержание Следующий шаг