Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_Лекции 2010.doc
Скачиваний:
69
Добавлен:
17.03.2015
Размер:
954.37 Кб
Скачать
      1. Организация стека вызовов

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

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

Механизм исключений предполагает использование двух конструкций. Первая - обеспечивает описанный выше алгоритм поиска обработчика исключения. Она может быть названа обрабатывающей конструкцией (try...except - в Delphi Pascal, try... catch - в стандарте C++, _try ... _except -в стандарте C). Операторы обработки исключения выполняются только, если при выполнении заданного фрагмента программы обнаруживается исключение указанного типа.

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

В целом при возникновении исключений возможны три варианта действий системы:

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

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

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

Исключение может инициироваться:

• операционной системой при получении сигналов от контролирующих схем, например, исключение «деление на ноль»;

• операционной системой при обнаружении некорректных ситуаций в работе программ самой операционной системы;

• библиотечными программами среды разработки;

• непосредственно разрабатываемой программой.

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

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

  1. СРЕДСТВА ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ В BORLAND C++ 3.1

Объектная модель C++, используемая Borland C++ 3.1, предоставляет программисту несколько большие возможности по сравнению с Borland Pascal 7.0. Так, в языке реализованы более надежные средства ограничения доступа к внутренним компонентам класса, перегрузка операций, возможность создания шаблонов функций и классов.