Мегаобучалка Главная | О нас | Обратная связь


Лабораторная работа 10. Исключительные ситуации



2020-02-04 223 Обсуждений (0)
Лабораторная работа 10. Исключительные ситуации 0.00 из 5.00 0 оценок




Цель: изучить класс Exception и возможности при обработке ошибок.

Класс Exception является прямым потомком базового класса TObject . Вместе со своими потомками он предназначен для обработки исключительных ситуация (исключений), возникающих при некорректных действиях программы: например, в случае деления на 0, при попытке открыть несуществующий файл, при выходе за пределы выделенной области динамической памяти и т. п. Рассматриваются основные свойства исключений и их использование для повышения надежности программ.

При работе в среде Delphi эксперименты с исключениями плохо прослеживаются, т. к. при каждом исключении среда перехватывает управление программой. В этом случае бывает полезно отменить такое поведение среды. Для этого вызовете опцию Tools, Debugger Options и на странице Language Exceptions уберите флажок в переключателе Stop on Delphi Exceptions.

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

try

<операторы>

except

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

else <операторы>

end;

Второй определяется в виде

try

<операторы>

finally

<операторы>

end;

Защищенный блок начинается зарезервированным словом try (попытаться [выполнить]) и завершается словом end. Существуют два типа защищенных блоков — except (исключить) и finally (в завершение), отличающихся способом обработки исключения. В блоке except порядок
выполнения операторов таков: сначала выполняются операторы секции try ... except; если операторы выполнены без возникновения исключительной ситуации, работа защищенного блока на этом прекращается и управление получает оператор, стоящий за end; если при выполнении части try возникло исключение, управление получает соответствующий обработчик в секции except, а если таковой не найден — первый из операторов, стоящих за словом else.

В блоке finally операторы в секции finally ... end получают управление всегда, независимо оттого, возникло ли исключение в секции try ... finally или нет. Если исключение возникло, все операторы в секции try ... finally, стоящие за «виновником» исключения, пропускаются и управление получает первый оператор секции finally ... end. Если исключения не было, этот оператор получает управление после выполнения последнего оператора секции try ... finally.

Обработчики исключений в блоке except имеют такой синтаксис:

on < класс исключения> do <оператор>;

Здесь on, do — зарезервированные слова; <класс исключения> — класс обработки исключения; <оператор> — любой оператор Object Pas cal.

Обратите внимание: имя класса служит своеобразным ключом выбора, а собственно обработка осуществляется оператором, стоящим за do (этот оператор может быть составным, так что обработка исключения может занимать произвольное количество операторов Object Pascal).

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

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

try

………..

 except

 ShowMessage(‘Ошибка’);

………………

end;

Защищенные блоки могут вкладываться друг в друга на неограниченную глубину и встречаться в блоке обработки исключительной ситуации.

Класс Exception является родительским для всех классов исключений. У этого класса имеется множество дочерних классов, каждый из которых отвечает за конкретное исключение. При возникновении исключительной ситуации объекты классов обработчиков создаются и уничтожаются автоматически. Таких классов очень много, поэтому рассмотрим только некоторые:

EAbort — обработка любой исключительной ситуации;

EIntError — любая ошибка в целочисленных вычислениях, среди
которых отметим такие: EDivByError — деление на 0, EintOverload — переполнение;

EMatcError — любая ошибка при выполнении вычислений с плавающей запятой, среди которых: EZeroDivide — вещественное деление на 0; EOverflow — переполнение; EInfalidArgument — аргумент функции вне допустимого диапазона;

EArrayError — ошибка при работе с массивами;

EConvertError— ошибка в функциях StrToInt и StrToFloat;

EFOpenError — ошибка при открытии файла;

EInOutError — любая ошибка в файловых операциях;

EInvalidGridOperator — любая ошибка при работе с таблицами;

EInvalidGraphOperator — недопустимая графическая операция.

Рассмотрим еще некоторые исключительные ситуации, которые будут работать с объектами, рассматриваемыми в следующих лабораторных работах: EStrimError — произвольная ошибка при работе с потоками данных, EThread — ситуация борьбы за общий ресурс в программе с несколькими потоками событий, EDatabaseError — ошибка при работе с базами данных.

Пример 1

Необходимо заполнить таблицу числа по следующему правилу: генерируется случайное число, а затем в ячейке компонента StringGrid 1 сохраняется обратное значение. Заранее не известно, был ли сгенерирован 0, и будет ли допустима операция деления. Для корректной работы данной программы необходимо задавать защищенный блок; процедура формирования таблицы будет иметь вид:

procedure TForm1.Button1Click(Sender: TObject);

var i,j:Integer;

 a:real;

begin

with StringGrid1 do

 begin

 ColCount:=SpinEdit1.Value+1;

 RowCount:=SpinEdit2.Value+1;

 for i :=1 to ColCount do

 for j:=1 to RowCount do

 Try                                    {Начало блока}

 a:=Random(10);

 Cells[i,j]:=FloatToStr(1/a);

 except

 On EZeroDivide do ShowMessage('Деление на ноль в ячейке '+IntToStr(i)+’,’ +IntToStr(j));     {Проверка класса ошибки}

 end;

 end;

end;

Если необходимо использовать поля и методы класса-обработчика, то можно перед именем класса поставить идентификатор и двоеточие:

 On EObject:Expecrion do ………….

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

В некоторых случаях бывает необходимо инициализировать исключительную ситуацию самостоятельно. Для этого используется зарезервированное слово raise (возбудить). Если этот оператор вставить в секцию Try … except или try … finally, то немедленно начнет работу секция обработки исключительной ситуации. Если данный оператор встретился в секции except … end или finally … end, то считается, что данный защищенный блок на текущем уровне вложенности завершил свою работу и управление
передается вышестоящему уровню.

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

function HexStrToInt(s:string):integer;

 function hex(c:char):integer ;

 begin

 case c of

 '0'..'9':Result:=ord(c)-ord('0');

 'A'..'F':Result:=ord(c)-ord('A')+10;

 end;

 end;

Var i:integer;

begin

result:=0;

if s[1]='$' then delete(s,1,1);

 For i:=1 to length(s) do

 Result:=result*16+hex(s[i]);

end;

Функция hex на основании символа возвращает число. Если данный символ является цифрой или латинской буквой от A до F, то возвращаемое число будет истинно, однако если это не так, то результат будет просчитан неправильно. Следовательно, в операторе case необходимо учесть ветвь иначе, где должна вызываться исключительная ситуацию. Тогда функция hex будет иметь вид:

function hex(c:char):integer ;

 begin

 case c of

 '0'..'9':Result:=ord(c)-ord('0');

 'A'..'F':Result:=ord(c)-ord('A')+10;

 else

 raise EConvertError.Creat

 (‘Недопустимое представление шестнадцатеричного числа ’);

 end;

 end;

В данном примере оператор raise инициализирует событие EConvertError, которое возникает при ошибке комвертации и в качестве параметра передает необходимое сообщение.

Задания:

1. Проверьте все программы из данной лабораторной работы.

2. Создайте текстовый редактор, который корректно работает при попытке открыть отсутствующий файл.



2020-02-04 223 Обсуждений (0)
Лабораторная работа 10. Исключительные ситуации 0.00 из 5.00 0 оценок









Обсуждение в статье: Лабораторная работа 10. Исключительные ситуации

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...
Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (223)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.006 сек.)