Программирование >>  Структурное программирование 

1 ... 239 240 241 [ 242 ] 243 244 245 ... 342


13.14. Исключения и наследование

Различные классы исключений могут быть порождены из общего базового класса. Если написан catch для перехвата объектов исключений типа базового класса, он может также перехватывать все объекты классов, порожденных из этого базового класса. Это позволяет осуществлять полиморфную обработку родственных ошибок.

Использование наследования для исключений дает возможность обработчику исключений перехватывать родственные ошибки, используя очень компактную запись. Конечно, можно было бы перехватывать каждый тип объекта исключения порожденного класса индивидуально, но более удобно перехватить объект исключения базового класса. Кроме того, перехватывание объектов исключений порожденных классов индивидуально может быть источником ошибок, если программист забывает явно проверить какие-то из типов порожденных классов.

Резюме

Некоторые распространенные примеры исключений: нехватка памяти, выход индекса за пределы массива, арифметическое переполнение, деление на нуль, недопустимые параметры функций.

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

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

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

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

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

Деструктор сгенерированного объекта выполняется после того, как завершается выполнение обработчика исключения.



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

Исключения не должны использоваться как альтернативный механизм задания потока управления. Поток управления со стандартными управляющими структурами вообще более ясен и более эффективен, чем применение исключений.

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

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

Обработка исключений должна использоваться в больших проектах, чтобы обрабатывать одинаковым способом ошибки, возникающие в различных местах проекта

Обработка исключений в С-1-+ подключается в ситуации, в которой функция обнаруживает ошибку, но не способна сама с ней управиться. Такая функция генерирует исключение (или, как иногда говорят, возбуждает или выбрасывает исключение). Если исключение соответствует типу параметра в одном из блоков catch, выполняется код этого блока. В противном случае, вызывается функция завершения terminate, которая по умолчанию вызывает функцию abort для аварийного завершения работы.

Программист включает в блок try код, который может генерировать ошибку, создающую исключение. Следом за блоком try записывается блоки перехвата catch (один или более). Каждый блок catch определяет тип исключений, которые он может перехватывать и обрабатывать. Каждый блок catch содержит программу - обработчик исключения.

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

Исключения генерируются в блоке try или в функции, вызываемой непосредственно или косвенно из блока try.

После того, как исключение сгенерировано, управление не может возвратиться в точку его генерации.

Из точки генерации исключения можно передать информацию обработчику этого исключения. Это информация о типе самого сгенерированного объекта или информация, помещенная в этот объект.

Один из наиболее популярных создаваемых типов исключений - тип char *. Его просто включать в сообщение об ошибке как операнд throw.



Глава 13

Операнд throw может быть любого типа. Если операнд является объектом, мы называем его объектом исключения.

Исключения, которые может генерировать некоторая функция, могут быть определены в спецификации исключений. Пустая спецификация исключений объявляет, что функция не будет генерировать никакие исключения.

Исключение перехватывается ближайшим обработчиком исключений (ближайшим к блоку try, в котором было сгенерировано исключение), содержащим спецификацию соответствующего типа.

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

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

Исключение завершает выполнение блока, в котором оно возникло.

Обработчики исключений содержатся в блоках catch. Каждый блок catch начинается с ключевого слова catch, за которым следуют круглые скобки, содержащие тип и необязательное имя параметра. Затем в фигурных скобках записываются операторы обработки исключения. Когда исключение перехвачено, начинает выполняться программа в блоке catch.

Обработчик catch определяет свою собственную область действия.

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

Можно изменить реакцию на неперехваченное исключение, заменив функцию завершения terminate другой и задав ее имя как аргумент в вызове функции set terminate.

catch (...) означает перехват всех исключений.

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

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

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



1 ... 239 240 241 [ 242 ] 243 244 245 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика