Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Исключения и их объектная обработка



Исключения (exception) – реакция вычислительной системы на некоторую особую ситуацию, возникшую при работе приложения. Чаще всего такие особые ситуации связаны с возникновением в исполняемом коде программы какой-либо ошибки – обращение к несуществующему файлу, неправильная работа с адресным указателем, несоответствие типов данных и т.д. В любом случае программа не может дальше выполняться и аварийно завершается с выводом некоторого кода ошибки. Любая программа, претендующая на роль современной, должна уметь перехватывать такие ситуации и, по возможности, обрабатывать их тем или иным способом. Для этого обычно в программу вставляется большое число проверок разных условий, что делает логику программы достаточно запутанной. Механизм исключений позволяет упростить обработку особых ситуаций, выделив в программе специальные блоки - обработчики исключений.

Все основные современные операционные системы и языки программирования поддерживают централизованную обработку исключений, которая строится на объектных принципах. Это означает, что для каждого подобного исключения автоматически создается объект соответствующего класса. Для этого все типичные ошибки времени выполнения классифицированы на несколько десятков классов. В языках Delphi Pascal и Java базовые библиотеки классов содержат специальную подиерархию классов, которые описывают наиболее типичные ошибки. Например, в библиотеке VCL родоначальником этой иерархии является класс Exception. Этот класс содержит около десяти различных конструкторов, которые используются при создании объекта-исключения. Каждый созданный объект несет информацию о возникшей особой ситуации.

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

· EInOutError – ошибки при выполнении операций ввода или вывода;

· EIntError – ошибки целочисленной арифметики;

· EMathError – ошибки при обработке вещественных чисел;

· EConvertError – ошибки преобразования типов;

· EAccessViolation – ошибки, связанные с неправильным использованием памяти.

Эти классы, в свою очередь, могут быть родителями для более конкретных классов, например – EDivByZero (целочисленное деление на ноль). Знание иерархии классов исключений очень важно для грамотного применения данного механизма.

Для объектной обработки исключений, прежде всего в исходном тексте, необходимо найти те операторы, которые потенциально могут быть источниками таких ошибок. Эти операторы могут идти последовательно друг за другом либо могут быть разбросаны по всему исходному коду. Такие операторы можно назвать критическим или защищенным кодом. Начало критического кода обозначается специальной директивой try, за которой идет один или несколько критических операторов. После них размещается специальный блок обработки исключений. Начало этого блока обозначается директивой except в языке программирования Delphi Pascal и директивой catch в Java. Общий вид критического кода выглядит следующим образом:

try

критический оператор(ы)

except

обработчики исключений

end;

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

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

except

on EIntError do …;

on EInOutError do …;

on ИмяКласса do …;

end;

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

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

Кроме стандартного блока try - except - end, довольно часто используется другая разновидность:

try

защищенный код

finally

операторы завершения

end;

В отличие от блока except, блок finally выполняется независимо от появления или не появления ошибки в блоке try. Блок finally целесообразно использовать для освобождения занятых ранее ресурсов. Блоки except и finally можно комбинировать друг с другом.

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

raise EMathError.Create;

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

Контрольные вопросы

1. Какие классы называются интерфейсными?

2. С какими целями вводятся интерфейсные классы?

3. Какой механизм наследования доступен для интерфейсных классов?

4. Как взаимодействуют интерфейсные и реальные классы?

5. Какие типы классов может включать объектная модель приложения?

6. Чем интерфейсные классы отличаются от абстрактных классов?

7. Как выполняется описание интерфейсных классов в языке Java?

8. Как принцип полиморфизма применяется к интерфейсным типам?

9. Какие интерфейсы являются базовыми для стандартной библиотеки контейнеров языка Java?

10. Какие контейнеры реализованы в стандартной библиотеке классов языка Java?

11. Что такое итераторы и как они используются?

12. Какие методы объявляются в стандартных итераторах языка Java?

13. Что такое компараторы и как они используются?

14. Как объявляются интерфейсные классы в языке Delphi Pascal?

15. Что такое обобщенные классы?

16. Как объявляются шаблонные функции в языке С++?

17. Когда и каким образом обрабатываются шаблонные функции?

18. Приведите пример описания и использования шаблонной функции.

19. Что такое шаблонный класс и что он может содержать?

20. Приведите пример описания шаблонного класса.

21. Как выполняется описание методов шаблонного класса за пределами класса?

22. Что происходит при обработке объявлений объектов шаблонных классов?

23. Что такое STL?

24. Что такое исключения?

25. В чем смысл объектной обработки исключений?

26. Приведите примеры наиболее типичных классов исключений.

27. Что необходимо сделать в программах для обработки исключений?

28. Приведите общую структуру программного кода для обработки исключений?

29. Как оформляется блок завершения и чем он отличается от блока обработки исключений?

30. Как программно можно сгенерировать исключение?





Дата публикования: 2014-11-02; Прочитано: 776 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.009 с)...