рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Цель обработки ИС - защищать приложения от воздействия неизбежно возникающих ошибок

Цель обработки ИС - защищать приложения от воздействия неизбежно возникающих ошибок - раздел Информатика, 5.19. Исключительные Ситуации (Класс Exception) ...

5.19. Исключительные ситуации (класс Exception)

5.19.1. Что такое "исключение"

 

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

Ситуации, приводящие к нарушениям вычислительного процесса и требующие специальных действий по предотвращению аварийного завершения программы принято называть Исключительными ситуациями (ИС). Заметим, что ИС не обязательно связаны с прерываниями ОС. Например контроль количества циклов при решении нелинейных уравнений.

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

Платой за надежную работу программы в таких условиях служит введение многочисленных проверок, способных предотвратить некорректные действия в случае возникновения нештатной ситуации. Хорошо, если в конце очередной конструкции if..then можно просто поставить оператор Exit. Часто для корректного выхода из ситуации нужно отменить целую последовательность действий, предшествующих неудачному (например, освободить память). Все это сильно запутывает программу, маскируя четкую структуру главного алгоритма.

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

Цель обработки ИС - защищать приложения от воздействия неизбежно возникающих ошибок.

Замечание 1. Есть разница в реакции при запуске программы из Delphi и при активизации файла exe. При запуске из Delphi исключение будет сначала перехвачено средой и на экране появится сообщение на английском языке о характере и месте возникновении ошибки. например такое

Project Pro3 raised Exceptions class EdivideByZero With

message 'Division By Zero'. Project Stopped. Use Step or

Ran to continue

OK

После щелчка по OK приложение виснет. Надо нажать Ctrl+F9, появится окно с текстом Debug Session in progress

Terminate?

Надо щелкнуть по ОК и можно продолжить работу.

Другой способ – отключить перехватчик ИС отладчика. Для этого надо сбросить флажок опции Stop on Delphi Exception во вкладке Language Exception диалогового окна Debugger Options меню Tools.

Замечание 2. Если в программе надо предусмотреть проверку диапазона значений, например для данных типа диапазон, то предварительно надо установить опцию компилятора RangeChecking активной (Project / Options / окно Project Options / вкладка Compiler / RunTime errors / RangeChecking).

 

5.19.2. Исключительная ситуация как класс

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

Компилятор Delphi генерирует код, который перехватывает любое такое нештатное событие, сохраняет необходимые данные о состоянии программы, и выдает разработчику объект. С точки зрения Delphi исключительная ситуация — это объект.

Этот объект можно обработать, используя в программе специальную языковую конструкцию (try. .except). Если такая конструкция не предусмотрена, все равно исключение будет обработано — в недрах VCL есть соответствующие обработчики, окружающие все потенциально опасные места.

Чем же различаются между собой исключительные ситуации? Как отличить одну исключительную ситуацию от другой? Поскольку это объекты, они отличаются классом (объектным типом). В модуле SYSUTILS.PAS описан объектный тип Exception. Он является предком для всех других объектов — исключительных ситуаций. Класс Exception имеет следующую структуру

Exception = class(TObject)

private

FMessage: string;

FHelpContext: Integer;

public

constructor Create(const Msg: string);

constructor CreateEmt(const Msg: string; const Args: array of const);

constructor CreateRes(Ident: Integer); overload;

constructor CreateRes(ResStringRec: PResStringRec); overload;

constructor CreateResFmt(Ident: Integer; const Args: array of const);

overload; constructor CreateResFmt(ResStringRec: PResStringRec; const Args: array of const);

overload;

constructor CreateHelp(const Msg: string; AHelpContext: Integer);

constructor CreateFmtHelp(const Msg: string; const Args: array of const;

AHelpContext: Integer);

constructor CreateResHelp(Ident: Integer; AHelpContext: Integer);

overload;

constructor CreateResHelp(ResStringRec: PResStringRec; AHelpContext: Integer); overload;

constructor CreateResFmtHelp(ResStringRec: PResStringRec; const Args: array of const; AHelpContext: Integer); overload;

constructor CreateResFmtHelp(Ident: Integer; const Args: array of const; AHelpContext: Integer); overload;

property HelpContext: Integer read FHelpContext write FHelpContext;

property Message: string read FMessage write FMessage;

end;

Как видно из приведенного описания класса Exception, у него имеется двенадцать конструкторов (количество конструкторов зависит от версии), позволяющих задействовать при создании объекта текстовые строки из ресурсов приложения (имя включает строку Res), форматирование текста (включает Fmt), связь с контекстом справочной системы (включает Help).

Конструкторы, в названии которых встречается подстрока Fmt, могут вставлять в формируемый текст сообщения об ошибке значения параметров, как это делает стандартная функция Format:

 

If MemSize > Limit then

raise EOutOfMemory.CreateFmt('Cannot allocate more than %d

bytes',[Limit]);

 

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

И наконец, если в названии фигурирует подстрока Help, то такой конструктор инициализирует свойство HelpContext создаваемого объекта. Естественно, система помощи должна быть создана и в ней должна иметься статья, связанная с этим контекстом. Теперь пользователь может затребовать помощь для данной ситуации, скажем, нажав клавишу <F1> в момент показа сообщения об ИС.

Тип Exception порождает многочисленные дочерние типы, соответствующие часто встречающимся случаям ошибок ввода/вывода, распределения памяти и т. п. На рис.1 приведен фрагмент структуры класса Exception, в котором отражены потомки связанные с ИС возникающими при обработке числовых данных.

Заметим, что тип Exception и его потомки представляют собой исключение из правила, предписывающего все объектные типы именовать с буквы Т.

Потомки Exception начинаются с Е, например EZeroDivide.

 

5.19.3. Стандартные ИС

. Ниже приведено описание этой группы исключительных ситуаций.

EAbort - “скрытое” исключение. Используется, когда надо прервать тот или иной процесс с условием, что пользователь программы не должен видеть сообщения об ошибке. Для повышения удобства использования в модуле SysUtils предусмотрена процедура Abort, определенная, как:
procedure Abort;
begin
raise EAbort.CreateRes(SOperationAborted) at ReturnAddr;
end;
EIntError - предок исключений, возникающих при выполнении целочисленных операций.

Потомки EintError.

EDivByZero Попытка деления на ноль (целое число). Вызывается в случае деления на ноль, как результат RunTime Error 200.
ERangeError Число или выражение выходит за допустимый диапазон, вызывается при попытке обращения к элементам массива по индексу, выходящему за пределы массива, как результат RunTime Error 201 при включенной директиве {$R+}.
EIntOverflow Целочисленное переполнение - вызывается при попытке выполнения операций, приводящих к переполнению целых переменных, как результат RunTime Error 215 при включенной директиве {$Q+}.

EMathError- предок исключений, случающихся при выполнении операций с плавающей точкой.

Потомки EmathError.
EInvalidOpНеверная операция - возникает, когда математическому сопроцессору передается ошибочная инструкция. Такое исключение не будет до конца обработано, пока Вы контролируете сопроцессор напрямую из ассемблерного кода.
EZeroDivide Попытка деления на ноль.

EOverflowПереполнение с плавающей точкой - возникает как результат переполнения операций с плавающей точкой при слишком больших величинах. Соответствует RunTime Error 205.
EUnderflowИсчезновение порядка - возникает как результат переполнения операций с плавающей точкой при слишком малых величинах. Соответствует RunTime Error 206.
EinvalidArgumentНеверный аргумент математических функций

Самый важный отличительный признак объекта Exception — это все же класс, к которому он принадлежит. Именно факт принадлежности возникшей ИС к тому или иному классу говорит о том, что случилось. Если же нужно детализировать проблему, можно присвоить значение свойству Message. Если и этого мало, можно добавить в объект новые поля. Так, в ИС EinOutError (ошибка ввода/вывода) есть поле ErrorCode, значение которого соответствует произошедшей ошибке — запрету записи, отсутствию или повреждению файла и т. д.

Пример.

try

.FileOpenС с:myfile.txt', fmOpenWrite);

except

on E: EinOutError do

case E.ErrorCode of

ERROR_FILE_NOT_FOUND {=2}: ShowMessage('Файл не найден !');

ERROR_ACCESS_DENIED {=5}: ShowMessage('Доступ запрещен!');

ERROR_DISK_FULL {=112}: ShowMessage ('Диск переполнен!') ;

end;

end;

Впрочем, ИС EInOutError возникают только тогда, когда установлена опция компилятора {$IOCHECKS ON} (или иначе {$I+}). В противном случае проверку переменной IOResult (известной еще по Turbo Pascal) нужно делать самому.

 

5.19.4. Защитные конструкции языка

Для работы с объектами исключительных ситуаций существуют специальные конструкции языка Object Pascal— блоки try…. except и try….finally. Они контролируют выполнение операторов, помещенных внутри блока до ключевого слова exceptили finally. В случае возникновения исключительной ситуации штатное выполнение вашей программы немедленно прекращается, и управление передается операторам, расположенным за указанными ключевыми словами. Если в вашей процедуре эти блоки отсутствуют, управление все равно будет передано ближайшему блоку, внутри которого возникла ситуация. А уж внутри VCL их предостаточно.

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

Блок try..except применяется для реакции на конкретный тип ситуации.

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

 

5.19.5. Блок try..except

Для реакции на конкретный тип ситуации применяется блок try..except. Форма записи этого блока имеет вид

Try

Операторы

...

Except

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

Else

<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 не рекомендуется так как оно заблокирует все ИС, в том числе и предусмотренные программистом.

Замечание

Если вы не предусмотрели блоков обработки ИС в своем коде, это не должно привести к аварийному завершению всего приложения. Все места в VCL, где…  

– Конец работы –

Используемые теги: Цель, обработки, ИС, защищать, ложения, воздействия, неизбежно, возникающих, ошибок0.122

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

Что будем делать с полученным материалом:

Если этот материал оказался полезным для Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Еще рефераты, курсовые, дипломные работы на эту тему:

Создание фигур и изменение их геометрии в приложении MS Visio. Создание и разработка планировок в приложении MS Visio. Графический редактор Adobe Photoshop. Изучение панели инструментов редактора. Создание и обработка графических изображений.
Лабораторная работа Создание фигур и изменение их геометрии в приложении... ЦЕЛЬ РАБОТЫ приобретение навыков создания фигур средствами MS Visio...

Действия по речевым сообщениям гражданской обороны и спец. обработка после воздействия РВ
Особое значение оповещение приобретает в случае внезапногонападения противника, когда реальное время для предупреждения на-селения будет крайне… Современныесистемы дальнего обнаружения позволяют быстро оп-ределить не только… Это обеспечивает передачу сигнала по системеоповещения до штабов гражданской обороны и объектов.С целью своевременного…

МЕХАНИЧЕСКАЯ КУЛИНАРНАЯ ОБРАБОТКА СЫРЬЯ. ТЕПЛОВАЯ КУЛИНАРНАЯ ОБРАБОТКА ПРИГОТОВЛЕНИЕ И ОТПУСК БЛЮД
У Эскулапа прославленного врача древности были всесильные помощницы дочка Гигиена и кухарка Кулина услаждавшая дни...

Спектральный анализ и его приложения к обработке сигналов в реальном времени
Особенности реализации. Заключение. Выводы.

Термическая обработка и термомеханическая обработка обсадных труб из стали 36Г2С
По способу производства трубы подразделяют на литые, бесшовные и сварные. Основной объём производства составляют бесшовные и сварные.По назначению трубы… Так, для труб нефтяного сортамента условия эксплуатации весьма разнообразны: интервал рабочих температур от –60 до…

Климатические воздействия и их характеристики. Радиационные воздействия их характеристика
Формирование естественных климатических воздействий При составлении технических условий на РЭСИ, а также программы и методики испытаний естественные… Радиационный процесс характеризуется распределением радиационного баланса R,… Уравнение радиационного баланса: R=(Q+q)&#8729;(&#945;-1)&#87 29;E(1) На основании многочисленных…

Действия по речевым сообщениям гражданской обороны и спец. обработка после воздействия РВ
Особое значение оповещение приобретает в случае внезапногонападения противника, когда реальное время для предупреждения на-селения будет крайне… Современныесистемы дальнего обнаружения позволяют быстро оп-ределить не только… Это обеспечивает передачу сигнала по системеоповещения до штабов гражданской обороны и объектов.С целью своевременного…

МЕТОДИЧЕСКИЕ УКАЗАНИЯ по технико-экономическому обоснованию дипломных проектов и работ специальности 220200 Автоматизированные системы обработки информации и управления Методические указания для специальности 2202 Автоматизированные системы обработки инфо
Российский химико технологический университет... им Д И Менделеева... Новомосковский институт Издательский центр...

Приложение I. Причины ошибочных действий экипажей при управлении летательными
На сайте allrefs.net читайте: Приложение I. Причины ошибочных действий экипажей при управлении летательными...

ПРИЛОЖЕНИЯ
На сайте allrefs.net читайте: ПРИЛОЖЕНИЯ...

0.031
Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • По категориям
  • По работам