загрузка...
загрузка...
На головну

Безпека Надзвичайної Ситуації

Дивіться також:
  1. I. Поняття мовної ситуації.
  2. II частина ситуації оцінювання
  3. II. Розвиток внутрішньополітичної ситуації
  4. III. Загострення внутрішньополітичної ситуації в 1920-1924 рр.
  5. А. Осмислення проблемної ситуації
  6. Адміністративно-правове регулювання управління державною безпекою.
  7. Безпека
  8. Безпека в кредитних організаціях
  9. Безпека в океані і її аспекти
  10. Безпека дезінфекційних заходів та шляхи її забезпечення
  11. Безпека життєдіяльності
  12. Безпека життєдіяльності

лекція

Begin

Except

Begin

Except

Begin

Except

Except

Try

Begin

Else

Except

Try

Except

Try

ОБРОБКА виняткових ситуаціях У DELPHI

Виняткова ситуація - це деякий помилкове стан, що виникає під час виконання програми. Виняткові ситуації (виключення) можуть виникати з різних причин, наприклад через неможливість виконати перетворення, при розподілі на нуль і ін. У будь-якому випадку додаток отримує повідомлення про виникнення виключення.

У Delphi передбачений глобальний обробник виняткових ситуацій і можуть бути задіяні локальні обробники. Глобальна обробка винятків реалізується через об'єкт Application. Глобальна обробка забезпечує користувача інформацією про помилку, але не усуває причини.

Локальна обробка виняткових ситуацій дозволяє при виникненні помилки перейти до спеціально підготовленого коду програми. Такий підхід реалізується за допомогою мовних конструкцій, які як би «охороняють» фрагмент коду програми і визначають обробники помилок, які будуть викликатися, якщо в захищеному ділянці коду щось піде не так, як передбачалося.

Для позначення початку захищеного ділянки коду використовується службове слово try, завершується конструкція словом end. Існує два типи захищених ділянок: try ... except і try ... finally, які мають схожий синтаксис, але відрізняються за призначенням. Перший тип використовується для обробки виняткових ситуацій. Його синтаксис:

{Оператори, виконання яких може викликати помилку}

{Оператори, які повинні бути виконані в разі помилки}

end;

Конструкція try ... except застосовується для перехоплення виняткової ситуації та дозволяє відновити працездатність програми. Секція except може бути розбита на кілька частин on ... do для обробки різних класів винятків. Після конструкцій on ... do може бути поміщений розділ else, який відноситься до всього блоку. За логікою роботи група конструкцій on ... do нагадує оператор case. До винятків, які не мають своїх локальних обробників, застосовується механізм глобальної обробки через об'єкт Application.

{Оператори, виконання яких може викликати помилку}

{Оператори, які повинні бути виконані в разі помилки}

onException1 do...;

onException2 do...;

...

..

.end;

Розглянемо наступний приклад. В поля Edit1 і Edit2 записуються цілі числа. При натисканні на кнопку Button1 виконується переклад введених рядків у числовий формат, перше число ділиться на друге і результат виводиться в Edit3. Потім в Memo1 записуються вихідні рядки, сума чисел і частка від ділення першого числа на друге.

procedureTForm1.Button1Click (Sender: TObject);

Vara, b: integer;

rez: extended;

a: = strtoint (Edit1.Text);

b: = strtoint (Edit2.Text);

rez: = a / b;

Edit3.Text: = floattostr (rez);

Memo1.Lines.Add (Edit1.Text);

Memo1.Lines.Add (Edit2.Text);

Memo1.Lines.Add (inttostr (a + b));

emo1.Lines.Add (floattostr (rez));

Mend;

Під час роботи програми виняткові ситуації можуть виникнути при виконанні перетворення рядок-число і при обчисленні частки від розподілу, якщо дільник дорівнює нулю або нулю рівні обидва введених числа. Якщо запустити програму на виконання, то при виникненні будь-якого з виключень спрацює глобальна система обробки виняткових ситуацій. При цьому виконання процедури буде перервано і будуть виводитися повідомлення про причини помилки.

Введемо локальну обробку виняткових ситуацій. Для цього сформуємо захищений блок.

procedureTForm1.Button1Click (Sender: TObject);

Vara, b: integer;

ez: extended;

rbegin

a: = strtoint (Edit1.Text);

b: = strtoint (Edit2.Text);

rez: = a / b;

Edit3.Text: = floattostr (rez);

ShowMessage ( 'Помилка!');

end;

Memo1.Lines.Add (Edit1.Text);

Memo1.Lines.Add (Edit2.Text);

Memo1.Lines.Add (inttostr (a + b));

Memo1.Lines.Add (floattostr (rez));

end;

В цьому випадку при виникненні будь-якого винятку буде перериватися виконання операторів захищеного блоку, в Edit3 результат не з'явиться. На екран буде виведено вікно з повідомленням «Помилка!». Оператори, розташовані після захищеного блоку, будуть виконуватися, тобто в Memo1 з'являться записи.

Змінимо секцію except. Перевіримо одну з можливих помилок - поділ на нуль. Далі наводиться фрагмент коду, до якого внесено зміни.

onEZeroDivide do

ShowMessage ( 'Спроба ділення на нуль!');

Edit2.SetFocus;

end;

В цьому випадку при виникненні інших винятків спрацює глобальний обробник, тобто виконання процедури буде перервано.

Додамо локальний обробник для контролю за перетворенням даних, що вводяться. При цьому глобальна обробка винятків буде задіяна тільки для нульових введених значень (0/0).

onEZeroDivide do

ShowMessage ( 'Спроба ділення на нуль!');

Edit2.SetFocus;

end;

onEConvertError doShowMessage ( 'Помилка перетворення!');

Якщо ввести секцію else, то все виключення будуть оброблені локально.

onEZeroDivide do

ShowMessage ( 'Спроба ділення на нуль!');

Edit2.SetFocus;

end;

onEConvertError doShowMessage ( 'Помилка перетворення!')

elseShowMessage ( 'Помилка в захищеному блоці!');

Конструкцію try ... finally використовують в тих випадках, коли існують дії, які обов'язково треба виконати до завершення програми. Код, розташований в частині finally, виконується в будь-якому випадку, навіть якщо виникає виняткова ситуація. Якщо помилки не виникло, то послідовно виконуються всі оператори секцій.

try

... {Оператори, виконання яких може викликати помилку}

finally

{Оператори, які повинні бути виконані навіть у разі помилки}

end;

Конструкцію try ... finally можна включити в блок try ... except. Це дозволяє виконати обов'язкові оператори секції finally і обробити виняток операторами секції except. Обидва типи конструкцій можна використовувати в будь-якому місці, допускається вкладеність будь-якої глибини.

Базовим класом для всіх винятків є клас Exception. Нащадки цього класу охоплюють велику кількість винятків, які можуть виникнути в процесі роботи додатків. Імена нащадків класу

Exception починаються з літери E. Нижче наведені найбільш часто використовувані класи виключень.

EConvertError -помилка перетворення типів, може виникнути при виконанні функцій StrToInt і StrToFloat.

EInOutError -Помилка вводу / виводу при включеній директиві {$ I +}.

EDivByZero - поділ цілого на нуль.

EIntOverflow - переповнення в операції з цілими змінними.

ERangeError - привласнення значення, що виходить за межі допустимого діапазону. Наприклад, при спробі звернення до елементів масиву за індексом, що виходить за межі масиву.

EInvalidGraphic -спроба завантаження методом LoadFromFile файлу, несумісного графічного формату.

EInvalidPointer - некоректна операція з покажчиком.

EFCreateError -помилка створення файлу

EFOpenError -помилка відкриття файлу

EListError, EStringListError - помилка при роботі зі списками.

EMathError -предок винятків, що виникають при виконанні операцій з плаваючою крапкою.

EInvalidOp -спроба передачі математичного сопроцессору помилковою інструкції.

EOverflow -переповнення при занадто великих величинах.

EUnderflow - втрата значущості при операції з плаваючою точкою (занадто мала величина). Результат отримує нульове значення.

EZeroDivide -спроба поділу на нуль.

EMenuError -помилка при роботі з пунктами меню для компонент TMenu, TMenuItem, TPopupMenu і їхніх спадкоємців.

EOutOfMemory -виклик методів New, GetMem або конструкторів класів при неможливості розподілу пам'яті.

EOutOfResources -помилка при виконанні запиту на виділення або заповнення Windows-ресурсів (наприклад, обробника handles).

Структурну обробку виняткових ситуацій, реалізовану в Delphi, можна доповнювати традиційним підходом до обробки помилок, який полягає в аналізі кодів помилок, що повертаються функціями.

ПИТАННЯ ДЛЯ САМОКОНТРОЛЮ

1. У чому принципова відмінність локальної та глобальної обробки виняткових ситуацій?

2. Які типи помилок (синтаксичні, логічні або динамічні) дозволяє обробити наявний в Delphi механізм?

3. Яка конструкція використовується для відновлення працездатності програми?

4. У яких випадках в код включають блок try ... finally?

5. Проаналізуйте наведені приклади обробки виняткових ситуацій і визначте, які значення будуть виводитися в редактор Memoв кожному випадку. При виконанні аналізу слід розглядати всі можливі комбінації некоректного завдання даних.

6. Чи можна було в розглянутих раніше прикладах замінити конструкцію try ... except на try ... finally?

7. Чому при аналізі виняткових ситуацій доцільно використовувати exe-файл?

8. Чи можна створити свій клас виключення?

9. Чи можна створити власний глобальний обробник виключень?

10. Як буде вести себе додаток, якщо на форму поміщений компонент ApplicationEvents1 і сформована процедура:

procedure TForm1.ApplicationEvents1Exception (Sender: TObject; E: Exception);

begin

ShowMessage ( 'Помилка при виконанні додатка');

end;

Характеристика стихійних лих і захист «-- попередня | наступна --» Характеристика сіли, зсуву, обвалу.
загрузка...
© om.net.ua