
- •Часть I
- •Содержание
- •Лабораторная работа №1. Интегрированная среда разработки Delphi. Обзор основных компонентов.
- •Пример создания простейшего Windows-приложения.
- •Содержание отчета.
- •Контрольные вопросы.
- •Лабораторная работа №2. Способы организации файлового ввода-вывода. Динамические массивы.
- •Переменные TextFileName и GraphFileName указывает путь к файлу.
- •Содержание отчета.
- •Контрольные вопросы.
- •Лабораторная работа №3. Обработка исключительных ситуаций в Delphi.
- •Вывод сообщений
- •Пример создания приложения с обработкой ис.
- •Содержание отчета.
- •Контрольные вопросы.
- •Лабораторная работа №4. Изучение графических возможностей Delphi.
- •Пример создания приложения, использующего графические возможности Delphi.
- •Содержание отчета.
- •Контрольные вопросы.
- •Литература.
Лабораторная работа №3. Обработка исключительных ситуаций в Delphi.
Цель работы: изучение основных способов обработки исключительных ситуаций в Delphi, приобретение практических навыков при использовании основных блоков защиты кода try…except… и try…finally…
Краткие теоретические сведения.
Всякое взаимодействие с операционной системой на предмет получения ресурсов — места на диске, в памяти, открытие файла — может завершиться неудачно. Любое вычисление может закончиться делением на ноль или переполнением. При возникновении исключительных ситуаций (ИС) программа генерирует исключение и выполнение дальнейших действий в данном блоке прекращается. Платой за надежную работу программы в таких условиях служит введение многочисленных проверок, способных предотвратить некорректные действия в случае возникновения нештатной ситуации.
При разработке приложений в Delphi есть возможность использовать несколько механизмов, обеспечивающих обработку исключительных ситуаций. Это и классы, предназначенные для программирования реакции на ошибки, и специальные операторы языка Object Pascal.
В Delphi есть иерархия классов во главе с базовым классом Exception, которые предназначены для обработки исключительных ситуаций. В таблицах 1 и 2 приведены некоторые такие классы.
Таблица 1. ИС целочисленной математики (порождены от EIntError)
-
Тип
Условие возникновения
EDivByZero
Попытка деления на ноль (целое число)
ERangeError
Число или выражение выходит за допустимый диапазон
EIntOverflow
Целочисленное переполнение
Таблица 2. ИС математики с плавающей точкой (порождены от EMathError)
-
Тип
Условие возникновения
EInvalidOp
Неверная операция
EZeroDivide
Попытка деления на ноль
EOverflow
Переполнение с плавающей точкой
EUnderflow
Исчезновение порядка
EInvalidArgument
Неверный аргумент математических функций
Защитные конструкции языка Object Pascal
Для работы с объектами исключительных ситуаций существуют специальные конструкции языка Object Pascal— блоки try…except и try…finally. Они контролируют выполнение операторов, помещенных внутри блока до ключевого слова except или finally. В случае возникновения исключительной ситуации штатное выполнение вашей программы немедленно прекращается, и управление передается операторам, идущим за указанными ключевыми словами. Если в вашей процедуре эти блоки отсутствуют, управление все равно будет передано ближайшему блоку, внутри которого возникла ситуация.
Блок try..except
Для реакции на конкретный тип ситуации применяется блок try..except. Синтаксис его следующий:
try
<Операторы>
except
on EExceptionl do < Оператор обработки ИС типа EExceptionl >;
on EException2 do <Оператор обработки ИС типа Eexception2 >;
...
else <Оператор> //обработчик прочих ИС
end;
Выполнение блока начинается с секции try. При отсутствии исключительных ситуаций только она и выполняется. Секция except получает управление в случае возникновения ИС. После обработки происходит выход из защищенного блока, и управление обратно в секцию try не передается; выполняются операторы, стоящие после end.
Если вы хотите обработать любую ИС одинаково, независимо от ее класса, вы можете писать код прямо между операторами except и end. Но если обработка отличается, здесь можно применять набор директив on...do, определяющих реакцию приложения на определенную ситуацию. Каждая директива связывает ситуацию (on...), заданную своим именем класса, с группой операторов (do...).
Иногда замена if...then на try...except не приводит к экономии кода. Однако если при решении вычислительной задачи проверять на возможное появление ИС приходится не один, а множество раз, то выигрыш неоспорим — достаточно одного блока try...except на все вычисления.
При возникновении ИС директивы просматриваются последовательно, в порядке их описания. Каждый тип исключительной ситуации, описанный после ключевого слова on, обрабатывается именно этим блоком: только то, что предусмотрено в нем, и будет являться реакцией на данную ситуацию.
Если возникла ситуация, не определенная ни в одной из директив, выполняются те операторы, которые стоят после else. Если и их нет, то ИС считается не обработанной и будет передана на следующий уровень обработки. Этим следующим уровнем может быть другой оператор try...except, который содержит в себе данный блок.
Блок try...finally
Параллельно с блоком try...except в языке существует и try...finally. Он соответствует случаю, когда необходимо возвратить выделенные программе ресурсы даже в случае аварийной ситуации. Синтаксис блока try...finally таков:
try
<Операторы>{Операторы, способные привести к ИС}
finally
<Операторы> {Операторы, выполняемые в любом случае}
end;
Следующие за try операторы исполняются в обычном порядке. Если за это время не возникло никаких ИС, далее следуют те операторы, которые стоят после finally. В случае если между try и finally произошла ИС, управление немедленно передается операторам части finally…end. Таким образом, операторы, стоящие после finally, выполняются всегда. Блок try...finally еще называется блоком защиты ресурсов. Данная конструкция ничего не делает с самим объектом — исключительной ситуацией. Задача try...finally — только прореагировать на факт нештатного поведения программы и проделать определенные действия. Сама же ИС остается необработанной.
Блоки защиты ресурсов и обработчики ИС, как и другие блоки, могут быть вложенными:
try
try
…
finally
…
end;
except
…
end;
Вызов исключения
В некоторых случаях бывает необходимо инициировать собственное исключение. Для этого используется зарезервированное слово raise (возбудить). Если это слово встретилось в секции try.. .except или try.. .finally, немедленно начинают свою работу секции except... end и finally... end соответственно.
Слово raise возбуждает исключение самого общего класса Exception. Если программист желает возбудить исключение конкретного типа (не важно - стандартного или собственного), он должен явно указать класс создаваемого в этот момент объекта путем вызова его конструктора. Например, следующий оператор возбудит ошибку ввода/вывода:
raise EInOutError.Create('Ощибка!') ;
Такой прем - единственная возможность возбудить нестандартное исключение.