русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Обработка исключительных ситуаций.


Дата добавления: 2015-07-09; просмотров: 1431; Нарушение авторских прав


Исключительная ситуация, или исключение — это возникновение непредвиден­ного или аварийного события, которое может порождаться некорректным ис­пользованием аппаратуры. Например, это деление на ноль или обращение по не­существующему адресу памяти. Обычно эти события приводят к завершению программы с системным сообщением об ошибке. С++ дает программисту воз­можность восстанавливать программу и продолжать ее выполнение.

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

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

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

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

Общий механизм обработки исключений

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



Рассмотрим, каким образом реализуется обработка исключительных ситуаций.

□ Обработка исключения начинается с появления ошибки. Функция, в которой она возникла, генерирует исключение. Для этого используется ключевое сло­во throw с параметром, определяющим вид исключения. Параметр может быть константой, переменной или объектом и используется для передачи инфор­мации об исключении его обработчику.

□ Отыскивается соответствующий обработчик исключения и ему передается управление.

□ Если обработчик исключения не найден, вызывается стандартная функция terminate, которая вызывает функцию abort, аварийно завершающую текущий процесс. Можно установить собственную функцию завершения процесса.

Синтаксис исключений

Ключевое слово try служит для обозначения контролируемого блока — кода, в котором может генерироваться исключение. Блок заключается в фигурные скобки:

try { }

Все функции, прямо или косвенно вызываемые из try-блока, также считаются ему принадлежащими.

Генерация (порождение) исключения происходит по ключевому слову throw, кото­рое употребляется либо с параметром, либо без него:

throw [ выражение ]:

Тип выражения, стоящего после throw, определяет тип порождаемого исключения. При генерации исключения выполнение текущего блока прекращается, и происхо­дит поиск соответствующего обработчика и передача ему управления. Как прави­ло, исключение генерируется не непосредственно в try-блоке, а в функциях, прямо или косвенно в него вложенных.

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

catch(тип имя){ ... /* тело обработчика */ } catch(тип){ ... /* тело обработчика */ }-catch(…){ … /* тело обработчика */ }

Первая форма применяется, когда имя параметра используется в теле обработчи­ка для выполнения каких-либо действий — например, вывода информации об ис­ключении. Вторая форма не предполагает использования информации об исклю­чении, играет роль только его тип. Многоточие вместо параметра обозначает, что обработчик перехватывает все исключения. Так как обработчики просматрива­ются в том порядке, в котором они записаны, обработчик третьего типа следует помещать после всех остальных.

Перехват исключений

Когда с помощью throw генерируется исключение, функции исполнительной библиотеки С++ выполняют следующие действия:

1)создают копию параметра throw в виде статического объекта, который сущест­вует до тех пор, пока исключение не будет обработано;

2) в поисках подходящего обработчика раскручивают стек, вызывая деструкто­ры локальных объектов, выходящих из области действия;

3) передают объект и управление обработчику, имеющему параметр, совмести­мый по типу с этим объектом.

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

Обработчик считается найденным, если тип объекта, указанного после throw:

□ тот же, что и указанный в параметре catch (параметр может быть записан в форме Т, const Т. Т& или const Т&, где Т— тип исключения);

□ является производным от указанного в параметре catch (если наследование производилось с ключом доступа publiс);

□ является указателем, который может быть преобразован по стандартным пра­вилам преобразования указателей к типу указателя в параметре catch.

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

 

Исключения в конструкторах и деструкторах

Язык С++ не позволяет возвращать значение из конструктора и деструктора. Механизм исключений дает возможность сообщить об ошибке, возникшей в кон­структоре или деструкторе объекта.

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

Если объект создается в динамической памяти с помощью операции new и в кон­структоре возникнет исключение, память из-под объекта корректно освобожда­ется.



<== предыдущая лекция | следующая лекция ==>
Явные преобразования static_cast, dynamic_cast. | В 8. Задание


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.377 сек.