Як було сказано вище, в програмі під час її роботи можуть виникати помилки, причиною яких, як правило, є дії користувача. Наприклад, користувач може ввести невірні дані або, що буває досить часто, видалити потрібний програмі файл.
Порушення в роботі програми називається винятком. Обробку виключень (помилок) бере на себе автоматично додається в виконувану програму код, який забезпечує, в тому числі, висновок інформаційно го повідомлення. Разом з тим 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 завершує свою роботу.