Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по ООП.doc
Скачиваний:
31
Добавлен:
25.09.2019
Размер:
1.04 Mб
Скачать

58.Запись шаблона функции с несколькими обобщенными аргументами.

65.Исключение как статический объект.

Исключительная ситуация (exception) – это любая ошибка или ошибочное условие, возникающее в процессе выполнения программы. Когда программа обнаруживает ошибку, она генерирует исключительную ситуацию. При этом нормальный ход выполнения программы прерывается, и управление передается специальной части кода, которая выполнят обработку этой исключительной ситуации. После обработки исключительной ситуации возврат в точку ее возникновения не происходит, а выполняются действия, следующие за телом обработчика.

Исключение может порождаться ошибками, такими, как деление числа на нуль или обращением к памяти по недействительному адресу. В качестве ответа на ошибку функция, в которой возникла ошибка, инициирует (возбуждает) исключение оператором throw, за которым следует значение. Это значение может бытъ константой, переменной или объектом и предназна­чено для передачи информации обработчику исключения об исключении.

Этот механизм успешно работает даже тогда, когда исключительную ситуацию генерирует вызываемая подпрограмма, а обрабатывает вызывающая. В итоге удается отделить смысловую часть алгоритмов от обработчиков ошибок; программа становится более простой, понятной и отказоустойчивой.

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

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

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

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

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

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

catch (ловить),

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

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

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

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

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

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

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

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