logo
шпоры по ООП

64.Объектно-ориентированный подход к обработке исключений.

Объектно-ориентированный подход к обработке исключений.

Совсем недавно в компиляторах языка С++ наконец-то появились рекомендованные стандартом ANSI средства для обработки особых ситуаций. Такие ситуации в С++ называют исключительными ситуациями или исключениями (Exceptions). Для компиляции приведенных в этом разделе программ можно использовать, например, компиляторы Borland C++ версий 4.0, 4.5 и выше.

Механизм обработки особых ситуаций присутствовал в разных языках программирования до появления С++. Один из примеров - язык PL/1, в котором программисты могли работать как со встроенными (заранее запланированными) ситуациями, так и с ситуациями, создаваемымми (формируемыми) по указанию программиста при наступлении того или иного события. Типичные встроенные ситуации это "деление на нуль", "достижение конца файла", "переполнение в арифметических операциях" и т.п. В языке С++ практически любое состояние, достигнутое в процессе выполнения программы, можно заранее определить как особую ситуацию (исключение) и предусмотреть действия, которые нужно выполнить при ее возникновении.

Для реализации механизма обработки исключений в язык С++ введены следующие три ключевых (служебных) слова:

try (контролировать),

catch (ловить),

throw (генерировать, порождать, бросать, посылать, формировать).

Служебное слово try позволяет выделить в любом месте исполняемого текста программы так называемый контролируемый блок:

try { <операторы> }

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

throw <выражение_генерации_исключения>;

Когда выполняется такой оператор, то с помощью выражения, использованного после служебного слова throw, формируется специальный объект, называемый исключением. Исключение создается как статический объект, тип которого определяется типом значения выражения_генерации_исключения. После формирования исключения исполняемый оператор throw автоматически передает управление (и само исключение как объект) непосредственно за пределы контролируемого блока. В этом месте (за закрывающейся фигурной скобкой) обязательно находятся один или несколько обработчиков исключений, каждый из которых идентифицируется служебным словом catch и имеет в общем случае следующий формат:

catch (тип_исключения имя) { <операторы> }

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