Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Исключения при разработке классов

Читайте также:
  1. Индикаторы классовой принадлежности и допустимая эксцентричность
  2. Исключения из правила согласия
  3. классов интегрированного (совместного) обучения и воспитания
  4. Композиция при разработке классов
  5. Наполнение при разработке классов
  6. Об исключениях из персональной подследственности следователей Следственного комитета РФ см. ком. к ч. 4 ст. 151. 1 страница

 

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

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

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

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

· генерация информации о возникновении исключительной ситуации – генерация исключения

· обработка этой информации - перехват исключения.

При перехвате исключений используется стек вызовов, в котором в момент передачи управления очередной подпрограмме фиксируется адрес возврата. Например, если подпрограмма (или метод) А вызывает подпрограмму (или метод) В, а та в свою очередь вызывает подпрограмму (или метод) С, то в стеке последовательно записываются: адрес возврата в А и адрес возврата в В (рис.).

 

 

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

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

Механизм исключений предполагает использование двух конструкций:

1. первая – обеспечивает описанный выше алгоритм поиска обработчика исключения. Она может быть названа обрабатывающей конструкцией (try...except - в Delphi Pascal, try... catch - в стандарте C++, try... ex­cept - в стандарте С). Операторы обработки исключения выполняются только, если при выполнении заданного фрагмента программы обнаруживается исключение указанного типа.

2. вторая - используется в тех случаях, когда необходимо обеспечить правильное освобождение ресурсов метода даже при обнаружении исключительных ситуаций. Она называется завершающей конструкцией обработки исключения (try... Anally - в Delphi Pascal, try... Anally – в стандарте С, try... Anally - в стандарте C++Builder). Завершающая обработка исключения отличается от обычной тем, что блок операторов завершающей обработки выполняется в любом случае: как при обнаружении исключения, так и при его отсутствии. Эта конструкция обычно используется для обеспечения освобождения памяти, закрытия файлов и т.д.

В обоих случаях в месте обнаружения исключительной ситуации программист организует генерацию исключения (raise - в Delphi Pascal, throw - в C++, вызывает функцию RaiseException - в С). При генерации исключения создается некоторый объект, содержащий информацию об обнаруженной ситуации. В простейшем случае таким объектом может служить скалярная переменная одного из стандартных типов, а в более сложных - объект описанного ранее класса. В качестве информации может использоваться номер исключения, строка сообщения, значения операндов невыполненной операции, адрес некорректных данных и т.д.

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

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

· обнаружен фрагмент, включающий обрабатывающую конструкцию – исключение корректируется, и выполнение программы продолжается;

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

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

 


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


Читайте в этой же книге: Объектная декомпозиция | Объекты и сообщения | Т: Классы | Конец описания. | Простой полиморфизм | Конец описания. | Композиция при разработке классов | Наполнение при разработке классов | Делегирование методов | Контейнерные классы |
<== предыдущая страница | следующая страница ==>
Цикл-пока <очередной элемент> определен| Упаковывание

mybiblioteka.su - 2015-2024 год. (0.007 сек.)