Запобігання і обробка помилок

Як було сказано вище, в програмі під час її роботи можуть виникати помилки, причиною яких, як правило, є дії користувача. Наприклад, користувач може ввести невірні дані або, що буває досить часто, видалити потрібний програмі файл.
Порушення в роботі програми називається винятком. Обробку виключень (помилок) бере на себе автоматично додається в виконувану програму код, який забезпечує, в тому числі, висновок інформаційно го повідомлення. Разом з тим Delphi дає можливість програмі самій виконати обробку виключення.
Інструкція обробки виключення в загальному вигляді виглядає так:

try
// тут інструкції, виконання яких може викликати виключення
except // початок секції обробки виключень

on ТіпІсключенія1 do Обработка1;

on ТіпІсключенія2 do Обработка2;
on ТіпІсключеніяJ do ОбработкаJ;

else
// тут інструкції обробки інших винятків

end;

де:

  • try – ключове слово, що позначає, що далі йдуть інструкції, при виконанні яких можливе виникнення винятків, і що обробку цих виключень бере на себе програма;
  • except – ключове слово, що позначає початок секції обробки виключень. Інструкції цієї секції будуть виконані, якщо в програмі виникне помилка;
  • on – ключове слово, за яким слід тип винятку, обробку якого виконує інструкція, наступна за do;
  • else – ключове слово, за яким слідують інструкції, що забезпечують обробку винятків, тип яких не вказані в секції except.

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

Таблиця 13.1. Типові виключення

Тип винятку Виникає
EZeroDivide При виконанні операції ділення, якщо дільник дорівнює нулю
EConvertError При виконанні перетворення, якщо перетворюються величина не може бути приведена до необхідного виду. Найбільш часто виникає при перетворенні рядка символів в число
EFilerError При зверненні до файлу. Найбільш частою причиною є відсутність необхідного файлу або, в разі використання змінного диска, відсутність диска в накопичувачі

Наступна програма, вид діалогового вікна якої наведено на рис. 13.3, а текст-в лістингу 13.1, демонструє обробку винятків за допомогою інструкції try.

Рис. 13.3. Діалогове вікно програми

Лістинг 13.1. Обробка виключення типу EZeroDivide

unit UsTry_;
interface
uses
Windows, Messages, SysUtils, Classes,

Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class (TForm)

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;
Editl: TEdit; // напруга

Edit2: TEdit; // опір
Label5: TLabel; // результат розрахунку - ток
Button1: TButton; // кнопка Обчислити
procedure ButtonlClick (Sender: TObject);

private
{ Private declarations)

public
{ Public declarations}

end;
var
Form1: TForm1;
implementation
{$ R * .DFM}
procedure TForm1.Button1Click (Sender: TObject);

var
u: real; // напруга

r: real; // опір

i: real; // ток

begin
Labels.Caption : = ''; try
// інструкції, які можуть викликати виключення (помилку)

u : = StrToFloat (Edit1.Text);

r : = StrToFloat (Edit2.Text);

i : = U / r;
except // секція обробки винятків

on EZeroDivide do // поділ на нуль

begin
ShowMessage ( 'Опір не може дорівнювати нулю! ');

exit;

end;
on EConvertError do // помилка перетворення рядка в число

begin
ShowMessage ( 'Напруга і опір повинні бути '+
'задані числом. '+ # 13 +

'При записи дробового числа використовуйте кому. ';
exit;

end;

end;
Label5.Caption : = FloatToStr (i) + 'A';

end;
end.

У наведеній програмі виключення можуть виникнути при обчисленні величини струму. якщо користувач задасть, що опір дорівнює нулю, то при виконанні інструкції i: = u / r виникає Виняток EZeroDivide.
Якщо невірно буде введено числове значення, наприклад, для поділу цілої і дробової частин числа замість коми буде використана точка, то виникне виняток типу EConvertError. Обидва виключення обробляються однаково: виводиться повідомлення, після чого процедура обробки події Onclick завершує свою роботу.