Оператор try містить три частини:
§ контрольований блок - складений оператор, що передує ключовим словом try. У контрольований блок включаються потенційно небезпечні оператори програми;
§ один або декілька обробників виключень - блоків catch, в яких описується, як обробляються помилки різних типів;
§ блок завершення finally виконується незалежно від того, виникла помилка в контрольованому блоці чи ні.
Синтаксис оператора try:
try блок [ блоки catch ] [ блок finally ]
Бути відсутніми можуть або блоки catch, або блок finally, але не обидва одночасно.
Розглянемо, яким чином реалізується обробка виняткових ситуацій.
1. Обробка виключення починається з появи помилки. Функція або операція, в якій виникла помилка, генерує виключення. Як правило, виключення генерується не безпосередньо в блоці try, а у функціях, прямо або побічно в нього вкладених.
2. Виконання поточного блоку припиняється, відшукується відповідний обробник виключення, і йому передається управління.
3. Виконується блок final1у, якщо він присутній (цей блок виконується і в тому випадку, якщо помилка не виникла).
4. Якщо обробник не знайдений, викликається стандартний обробник виключення. Його дії залежать від конфігурації середовища. Зазвичай він виводить на екран вікно з інформацією про виключення і завершує поточний процес.
Подібні вікна не призначені для користувачів програми, тому всі виключення, які можуть виникнути в програмі, мають бути перехоплені і оброблені.
Обробники виключень повинні розташовуватися безпосередньо за блоком try. Вони починаються з ключового слова catch, за яким в дужках слідує тип оброблюваного виключення. Можна записати один або декілька обробників відповідно до типів оброблюваних виключень. Блоки catch є видимими в тому порядку, в якому вони записані, поки не буде знайдений відповідний типу викинутого виключення.
Синтаксис обробників нагадує визначення функції з одним параметром - типом виключення. Існують три форми запису:
catch( тип ім'я ) { ... /* тіло обробника */ }
catch( тип ) {... /* тіло обробника */ }
catch { ... /* тіло обробника */ }
Перша форма застосовується, коли ім'я параметра використовується в тілі обробника для виконання яких-небудь дій, наприклад виведення інформації про виключення.
Друга форма не припускає використання інформації про виключення, грає роль тільки його тип.
Третя форма застосовується для перехоплення всіх виключень. Оскільки обробники є видимими в тому порядку, в якому вони записані, обробник третього типу (він може бути тільки один) слід поміщати після всіх останніх. Приклад:
trу
{
// Контрольований блок
}
catch (OvertlowException е )
{
//Обробка виключення класу OverflowException (переповнення)
}
catch (DivideByZeroExceptfon)
{
//Обробка виключення класу DivideByZeroException (ділення на 0)
}
catch {
//Обробка усіх інших виключень
}
Якщо виключення в контрольованому блоці не виникло, всі обробники пропускаються. У будь-якому випадку, відбулося виключення чи ні, управління передається в блок завершення finally (якщо він існує), а потім - першому операторові, що знаходиться безпосередньо за оператором try. У завершуючому блоці зазвичай записуються оператори, яких необхідно виконати незалежно від того, виникло виключення чи ні, наприклад, закриття файлів, з якими виконувалася робота в контрольованому блоці, або виведення інформації.
У лістингу 4.11 приведена програма, що обчислює силу струму по заданій напрузі і опору. Оскільки вірогідність невірного набору дійсного числа досить висока, оператор введення включений в контрольований блок.