- •Санкт-Петербургский
- •Процедурное программирование
- •Объектно-ориентированное программирование
- •Обобщенное программирование
- •На пути к объектно-ориентированному программированию
- •Абстракция сущностей и процедурный язык программирования
- •Абстрактный тип данных
- •Организация класса
- •Определение и объявление класса
- •Члены класса
- •Маркеры доступа
- •Конструкторы
- •Понятие об объекте
- •Организация кода при работе с классами
- •Статические компоненты класса
- •Дружественные функции и дружественные классы
- •Особенности применения дружественных функций и классов
- •Перегрузка оператров
- •Перегрузка оператора присваивания
- •Реализация перегруженного оператора присваивания для класса Array
- •Перегрузка оператора индексирования
- •Понятие о константной функции
- •Константный вариант перегруженного оператора индексирования
- •Вычисление смешанных выражений
- •Наследование
- •Структура объекта порожденного класса
- •Доступ к элементам базового класса
- •Конструкторы порожденного класса
- •Порядок создания объекта порожденного класса
- •Перегруженный оператор присваивания порожденного класса
- •Вызов виртуальной функции из тела невиртуальной функции
- •Виртуализация функций не-членов класса
- •Идиома невиртуального интерфейса (nvi)
- •Реализация механизма виртуальных функций
- •Накладные расходы при работе с виртуальными функциями
- •Чисто виртуальные функции. Абстрактные базовые классы
- •Виртуальные деструкторы
- •Автономные и базовые классы
- •Дублирование подобъектов
- •Конструкторы при виртуальном наследовании
- •Работа с данными при виртуальном наследовании
- •Обработка исключительных ситуаций
- •Завершение или продолжение
- •Распределение обязанностей между разработчиком и клиентом
- •Генерация исключений
- •Объект исключения
- •Раскрутка стека
- •Спецификации исключений
- •Работа с обработчиками
- •Формат обработчика
- •Пример обработки исключений
- •Современная точка зрения на спецификации исключения
- •Шаблоны функций
- •Объявление и определение шаблона функции
- •Примеры объявлений и определений шаблонов функций
- •Инстанцирование шаблона функции
- •Неявное инстанцирование
- •Явное инстанцирование конкретной функции
- •Структура использования шаблона функции с явным инстанцированием
- •Перегрузка шаблона функции
- •Явная специализация шаблона функции
- •Шаблоны классов
- •Использование шаблона класса
- •Наследование и шаблоны
- •Шаблоны классов и отношение включения
- •Рекурсивное использование шаблонов классов
- •Друзья и шаблоны классов
- •Явная и частичная специализация шаблона класса
- •Алгоритмы
- •Алгоритм for_each
- •Функциональные объекты
- •Алгоритм copy
- •Алгоритм sort
- •Термины и определения
- •.Литература
Обработка исключительных ситуаций
Под исключением понимается ситуация, не позволяющая программе нормально работать. Например, программа может пытаться открыть недоступный ей файл. Рассмотрим вначале недостатки традиционных методов, связанные с анализом программой кодов ошибок, которые возвращаются функцией. К их числу можно отнести следующее:
Отсутствие структурированности. Код обработки ошибок не отделен от кода нормальной работы программы.
Возможность игнорирования кода ошибок.
Сложность обработки ошибок, возникающие при разработке библиотек. Разработчик библиотеки часто не в курсе как обрабатывать ошибки.
. Аппарат исключительных ситуаций предназначен для преодоления недостатков, присущих классическим методам обработки ошибок. Его преимущества состоят в следующем:
Код нормальной работы программы и код обработки ошибок структурно отделены.
Выброс исключения игнорировать нельзя. Отсутствие обработчика приводит к завершению работы программы.
Завершение или продолжение
В теории обработки исключений имеются две модели:
обработка с завершением работы программы.
обработка с продолжением работы программы.
В модели с завершением выполнения программы предполагается, что ошибка настолько серьезна, что возобновлять ее выполнение с точки возникновения ошибки нельзя. Необходимо позаботиться о корректном завершении программы. Например, сохранить не записанные на диск данные. Эта модель и принята в языке C++.
Распределение обязанностей между разработчиком и клиентом
Разработчик должен обеспечить:
выброс исключения при возникновении исключительной ситуации в разработанной им функции.
уведомить клиента о том, какие исключения может «выбросить» его функция.
Клиент должен предусмотреть обработчики исключений, которые могут выбросить используемые им функции.
Генерация исключений
Генерация исключения выполняется с помощью инструкции throw. Имеются два формата этой инструкции.
Первый формат:
throw<α>, гдеthrow– зарезервированное слово;
α - выражение.
Второй формат:
throw
Основным является первый формат. Второй формат применяется для так называемого повторного выброса исключений.
Назначение первого формата инструкции throwсостоит в создании объекта исключения. Основная информация для обработчика исключительной ситуации состоит в типе выброшенного объекта.
Объект исключения может иметь любой тип:
встроенный.
пользовательский.
Предпочтительней выбрасывать объекты пользовательского типа. Стандартным является использование анонимного объекта пользовательского типа. Предпочтительнее использовать либо один из классов стандартной библиотеки C++, предназначенных для работы с исключениями, либо порождать от этих классов собственный класс. Не рекомендуется использовать в инструкцииthrowстроковые литералы. Это усложняет реализацию обработчика.
Примеры хороших и плохих решений.
Хорошие решения:
throw std :: invalid_argumtnt(“Invalid _ argument in my_sqrt\n”); // используется библиотечный класс
throw Bad_index();// используется пользовательский // класс
Плохие решения (используются строковые литералы):
throw “Bad index\n”;
throw “Invalid argument\n”;
throw “Foo\n”;
throw “Help\n”;