Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Обработка исключительных ситуаций в 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('Ощибка!') ;

Такой прем - единственная возможность возбудить нестандартное исключение.

Вывод сообщений

Для вывода окна с сообщением предусмотрено несколько функций.

1. MessageDlg(const Msg: string; AType: TMsgDlgType;AButtons: TMsgDlgType;

HelpCtx: Longint):Word;

Отображает окно с сообщением Msg, с пиктограммой, задаваемой параметром AType, с набором кнопок, задаваемым параметром AButtons, и с темой справки, задаваемой параметром HelpCtx. Возвращает результат, указывающий, какую кнопку в диалоговом окне нажал пользователь.

2. MessageDlgPos(const Msg: string; AType: TMsgDlgType; Buttons: TMsgDlgType;

HelpCtx: Longint; X,Y: integer):Word;

Отображает окно с сообщением Msg, с пиктограммой, задаваемой параметром AType, с набором кнопок, задаваемым параметром AButtons, и с темой справки, задаваемой параметром HelpCtx. Параметры X и Y задают экранные координаты верхнего левого угла окна. Возвращает результат, указывающий, какую кнопку в диалоговом окне нажал пользователь.

3. ShowMessage(const Msg: string);

Отображает окно с сообщением Msg, с кнопкой OK.

 

Пример создания приложения с обработкой ИС.

Задание. Создать Windows-приложение для отображения матрицы. Матрица должна загружаться из файла, выбранного с помощью компонента OpenDialog.

Для выполнения этого задания на форме необходимо разместить следующие компоненты:

1. Страница - компонент OpenDialog .

2. Страница - компонент StringGrid .

3. Страница - компонент Button .

Один из возможных вариантов панели интерфейса создаваемого приложения показан на рис.1.

При работе с массивами ввод и вывод информации на экран удобно организовывать с помощью компонента StringGrid. Компонент StringGrid используется для отображения информации в виде таблицы. Пиктограмма компонента StringGrid находится на странице Additional Палитры Компонентов. Таблица содержит две зоны – фиксированную и рабочую. Фиксированная зона служит для вывода наименований строк и столбцов рабочей зоны и управления их размерами с помощью “мыши”. Фиксированная зона выделена другим цветом и в нее запрещен ввод информации с клавиатуры.

StringGrid
OpenDialog

Рис.1.

Количество строк и столбцов фиксированной зоны устанавливается в свойствах FixedRows и FixedCols соответственно. Рабочая зона содержит RowCountстрок и ColCountстолбцов информации, которую можно изменять как программно, так и с помощью “мыши” или клавиатуры. Доступ к содержимому ячеек в программе осуществляется с помощью свойства Cells[ACol, ARow: integer]: string, где ACol-номер столбца, а ARow – номер строки таблицы, причем нумерация начинается с нуля. По умолчанию в компонент StringGrid запрещен ввод информации с клавиатуры, для разрешения ввода информации в ячейки необходимо в Инспекторе Объектов дважды щелкнуть “мышью” на символе + свойства +Options и в открывшемся списке опций установить значение goEditing в True.

Так как в нашем задании фиксированная зона не используется, то в Инспекторе Объектов значения свойств FixedCols и FixedRowsможно установить равными 0. Организуем файл таким образом, чтобы в первой строке находилось количество строк матрицы, во второй – количество столбцов, а каждый элемент матрицы - в отдельной строке. Тогда, прочитав первые 2 цифры, можно установить значения свойств RowCount и ColCount компонента StringGrid. Так как при работе с файлами могут возникать ошибки ввода-вывода, то необходимо использовать защитные конструкции try..except и try..finally. В общем случае метод-обработчик события onClickдля компонента Button будет выглядеть следующим образом:

procedure TForm1.LoadClick(Sender: TObject);

var f1:textfile;

c,r,i,j,k:integer;

begin

if opendialog1.Execute then

if FileExists(OpenDialog1.FileName) then

begin

assignfile(f1,opendialog1.FileName);

try

try

reset(f1); // здесь возможна ошибка EInOutError

readln(f1,c); // здесь возможна ошибка EInOutError

readln(f1,r); // здесь возможна ошибка EInOutError

stringgrid1.ColCount:=c;

stringgrid1.rowCount:=r;

for i:=0 to r-1 do

for j:=0 to c-1 do

begin

readln(f1,k); // здесь возможна ошибка EInOutError

stringgrid1.Cells[j,i]:=inttostr(k);// здесь возможна ошибка

EConvertError

end;

finally

closefile(f1);

end;

except

on E:EInOutError do showmessage('Ошибка при работе с файлом: '+inttostr(E.Errorcode));

on EConvertError do showmessage('Ошибка преобразования типов');

end;

end

else showmessage('Файл не найден');

end;


Содержание отчета.

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

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

1. Обработка исключительных ситуаций в Delphi: блок try …except.

2. Обработка исключительных ситуаций в Delphi: блок try .. finally.

3. Обработка исключительных ситуаций в Delphi: вызов исключений (raise).

4. Компоненты StringGrid, SpinEdit: назначение, основные свойства.

 

Лабораторное задание.

Выполнить задание необходимо в соответствии с вариантом. Каждое задание предусматривает работу с одномерными массивами и матрицами. Исходные массивы должны вводиться из файла при нажатии на кнопку «Загрузить». Выбор файла реализовать с помощью компонента OpenDialog. На форме предусмотреть кнопку «Сохранить», при нажатии на которую результат сохраняется в файле. Программа должна обрабатывать все исключительные ситуации, которые могут возникнуть при вводе матрицы, формировании массивов и т. д. В случае возникновения ошибки должно выводиться окно с соответствующим сообщением. Номер строки или столбца массивов можно указывать в компоненте SpinEdit. Компонент SpinEdit находится на странице Samples Палитры Компонентов. Доступ к содержимому внутри окна компонента можно получить, используя свойство Text.

Варианты.

1. Создать приложения для вычисления и отображения 2-х одномерных массивов B и С. Элементы массивов должны быть получены из исходной целочисленной матрицы А в результате вычисления формул: ln(a[р,j]) (для массива В) и 1/ln(a[р,j]) (для массива С). Организовать выбор номера строки р матрицы А. Массивы должны формироваться при нажатии на кнопку «Пуск».

2. Заданы: целочисленная матрица А размером NxM и вектор В. Сформировать вектор С, элементы которого равны целой части частного от деления а[i,p]/cos(b[i]). Организовать выбор номера столбца p матрицы А. Вектор С должен формироваться при нажатии на кнопку «Пуск».

3. Заданы: целочисленная матрица А размером NxM и вектор В. Сформировать вектор С, элементы которого равны целой части частного от деления а[р,j]/cos(b[j]). Организовать выбор номера строки р матрицы А. Вектор С должен формироваться при нажатии на кнопку «Пуск».

4. Заданы: целочисленная матрица А размером NxM и вектор В. Сформировать вектор С, элементы которого равны целой части частного от деления b[i]/sin(а[i,р])). Организовать выбор номера столбца p матрицы А. Вектор С должен формироваться при нажатии на кнопку «Пуск».

5. Задана целочисленная матрица А размером NxM. Сформировать вектор В, элементы которого равны tg(a[i,р]). Организовать выбор номера столбца p матрицы А. Вектор В должен формироваться при нажатии на кнопку «Пуск».

6. Заданы вектора В и С размером N. Сформировать вектор А размером N, элементы которого равны целой части частного от деления с[i]/cos(b[i]). Вектор А должен формироваться при нажатии на кнопку «Пуск».

7. Создать приложения для вычисления и отображения 2-х одномерных массивов B и С. Элементы массивов должны быть получены из исходной целочисленной матрицы А в результате вычисления формул: a[р,j]/ a[р-1,j] (для массива В) и a[р,j]/ a[р+1,j] (для массива С). Организовать выбор номера строки р матрицы А. В случае выбора в качестве р номера первой или последней строки организовать замену на номер последней или первой строки соответственно. Массивы должны формироваться при нажатии на кнопку «Пуск».

8. Заданы: целочисленная матрица А размером NxM и вектор В. Сформировать вектор С, элементы которого равны целой части частного от деления а[р,j]/sin(b[j]). Организовать выбор номера строки р матрицы А. Вектор С должен формироваться при нажатии на кнопку «Пуск».

9. Задана целочисленная матрица А размером NxM. Сформировать вектор В, элементы которого равны sin(a[i,р])/a[i,р]. Организовать выбор номера столбца p матрицы А. Вектор В должен формироваться при нажатии на кнопку «Пуск».

10. Заданы: целочисленная матрица А размером NxM и вектор В. Сформировать вектор С, элементы которого равны целой части частного от деления а[i,p]/sin(b[i]). Организовать выбор номера столбца p матрицы А. Вектор С должен формироваться при нажатии на кнопку «Пуск».

Лабораторная работа №4.









Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2018 zdamsam.ru Размещенные материалы защищены законодательством РФ.