Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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

Else

Except

Try

Операторы

...

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

<0ператор> {обработчик прочих ИС}

end;

Здесь try (попытка), except(исключение, else(иначе) – ключевые слова.

Выполнение блока начинается с секции try. Между try и except располагаются операторы, выполнение которых может привести к возникновению ИС. Между словами except и end располагаются обработчики исключений.

Принцип действия.

Выполняются операторы в секции try..except в обычном порядке. Если их выполнение не привело к возникновению ИС, то операторы между except и end пропускаются и далее выполняются операторы расположенные после end.

Секция except …end получает управление в случае возникновения ИС. После обработки происходит выход из защищенного блока, и управление обратно в секцию try не передается, выполняются операторы, стоящие после end.

Среда Delphi содержит много стандартных исключений, поэтому в простейшем случае в секции except …end можно просто указать процедуру вывода сообщения, как показано в примере 1.

Пример 1.

Пусть есть форма, на которой располагаются два поля Edit (для ввода значения Х и вывода У) и кнопка "выполнить". При щелчке по кнопке "Выполнить" вводится значение Х и вычисляется значение У = Z / X. В данном примере возможна ситуация "деление на ноль". Текст обработчика кнопки "выполнить" имеет вид:

procedure TForm1.Button1Click(Sender: TObject);

var

x,y,z:integer;

begin

try

z:= 100;

x:=StrToint(Edit1.Text);

y:=z div (x);

Edit2.Text:=IntToStr(y);

except

ShowMessage('деление на 0!'}

end;

end.

Здесь после except указана процедура вывода сообщения. Значит будет использоваться стандартный класс. Эта ситуация эквивалентна обычному использованию оператора if …then для контроля данных.

Достоинства. Если введем Х = 0, то появится окно с сообщением 'деление на 0!', которое мы предусматривали в программе (можно написать более подробно). Кроме того после except мы можем предусмотреть различные действия.

В этом примере замена if..then на try..except, возможно не дает очевидной экономии кода. Однако если при решении, вычислительной задачи проверять на возможное деление на ноль приходится не один, а много раз для различных переменных, то выигрыш от нового подхода неоспорим — достаточно одного блока try..except на все вычисления.

Блок try …except может содержать любое количество операторов, приводящих к различным ИС. Если обработка их отличается, то в блоке except…end используется набор директив on..do, каждая из которых определяет реакцию приложения на определенную ситуацию. Каждая директива связывает ситуацию (on...), заданную своим именем класса, с группой операторов (do...). Перевести можно так " на исключение …… выполнять.....;".

Форма записи

except
on исключение 1 do оператор1;

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

............

else
оператор;

end;
После on записывается класс обработки исключения, а после do один простой или составной оператор. При этом играет роль порядок записи конструкций on... do. Если в списке конструкций on... do родительский класс предшествует дочернему, то дочерний класс никогда не получит управление.

Правило. В списке конструкций on... do дочерние классы должны предшествовать родительским классам.

Это касается и класса Eabort (он может обработать любое исключение) – ни один из стоящих после него обработчиков никогда не получит управление.

 

Неправильно правильно

on EIntError on EDivByZero

on EDivByZero on ERangeError

on ERangeError on EIntError

Пример. 2

try

i:=l;j:=0;

k:=i div j;

...

except

on EIntError do ShowMessage('IntError');

on EDivByZero do ShowMessage('DivByZero');

end;

 

В этом примере, хотя в действительности будет иметь место деление на ноль (EDivByZero), вы увидите сообщение, соответствующее родительскому классу EintError. Но стоит поменять две конструкции on..do местами, и все придет в норму.

Пример 3. Добавим в обработчик кнопки "выполнить" (см. Пример 1) переменную n типа диапазон (1..50) и оператор n:=x+20;. Кроме того в обработчик ситуации EdivByZero добавим операторы для записи нулей в поле Edit2, выделения их (Edit2.SelectAll;)и передачи этому полю фокуса (Edit2.SetFocus) при возникновении ситуации деления на ноль. Текст этой процедуры приведен ниже:

procedure TForm1.Button1Click(Sender: TObject);

var

x,y,z:integer;

n:1..50;

begin

try

z:= 100;

x:=StrToint(Edit1.Text);

y:=z div (x);

Edit2.Text:=IntToStr(y);

n:=x+20;

Edit3.Text:=IntToStr(n);

except

on ERangeError do showMessage('n вне диапазона');

on EDivByZero do begin

showMessage('деление на 0');

edit2.Text:='000';

Edit2.SetFocus;

Edit2.SelectAll;

end;

end;

end.

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

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

!!! Использовать else вместе с Try … except не рекомендуется так как оно заблокирует все ИС, в том числе и предусмотренные программистом.

В ряде случаев можно в блоке try...except не размещать ничего. Пустой блок применяют, когда хотят просто проигнорировать возникновение некоторых ситуаций. Например, в программе предусмотрена некая обработка данных, которая может завершиться неудачно, но это не повлияет на дальнейшую работу, и пользователь может об этом не знать. В этой ситуации вполне уместно изолировать ее в пустом блоке try..except. Важно только не поместить туда больше кода, чем нужно — иначе "с водой можно выплеснуть и ребенка".

Если вы не предусмотрели блоков обработки ИС в своем коде, это не должно привести к аварийному завершению всего приложения. Все места в VCL, где управление передается коду разработчика (в том числе, конечно, все обработчики событий всех компонентов), заключены в такие блоки. Но, увы, в Borland не знают о конкретных проблемах вашей программы, и максимум, что они могут сделать для вас, — это проинформировать о типе и месте возникновения ИС. Стандартная обработка подразумевает вывод на экран панели текстового сообщения (из свойства Exception.Message) с указанием типа ошибки. Можно получить и развернутую информацию с именем модуля и адреса, где она имела место (рис. 3.2).

 

Рис. 3.2. Типовое окно сообщения об ошибке Для этого нужно вызвать процедуру

procedure ShowException(ExceptObject: TObject; ExceptAddr: Pointer);

имеющуюся в модуле SYSUTILS.PAS.

Если предусмотренной вами обработки ИС недостаточно, то можно продолжить ее дальше программно при помощи оператора raise.

Этот оператор уже встречался нам при описании создания пользовательских ИС. Там за ним следовал вызов конструктора ИС. Здесь же конструктор опущен: возбуждаться будет уже существующий объект ИС, приведший нас в блок:

...

sl:= TStringList. Create;

try

s1.LoadFromFile(AFileName);

except

sl.Free;

raise;

end;

...

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

 

<== предыдущая лекция | следующая лекция ==>
Пример1 | Функция Assert. Исключительная ситуация Eabort
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 328; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.023 сек.