Керівництво C#, Оператори throw та finally
Оператор throw
Виняток може бути згенеровано вручну за допомогоюоператора throw. Нижче наведено загальну форму такого генерування:
де як exceptOb повинен бути позначений об'єкт класу винятків, похідного від класу Exception. Нижче наведено приклад програми, де демонструється застосування оператора throw для генерування винятку OverflowException:
Зверніть увагу, що виняток OverflowException було згенеровано з використанням ключового слова new в операторі throw. Не слід забувати, що в даному випадку генерується конкретний об'єкт, а отже, він має бути створений перед генеруванням винятку. Це означає, що згенерувати виняток лише з його типу не можна. У цьому прикладі для створення об'єкта OverflowException був автоматично викликаний конструктор, який використовується за умовчанням, хоча для створення винятків доступні й інші конструктори.
Повторне генерування винятків
Виняток, перехоплений в одному блоці catch, може бути повторно згенерований в іншому блоці, щоб бути перехопленим у зовнішньому блоці catch. Найбільш ймовірною причиною для повторного генерування виключення є надання доступу до виключення кільком обробникам. Припустимо, що один обробник оперує якимось одним аспектом виключення, а інший обробник - іншим його аспектом. Для повторного генерування виключення достатньо вказати оператор throw без супутнього виразу, як у наведеній нижче формі:
Не слід, проте, забувати, що коли виняток генерується повторно, воно не перехоплюється знову тим самим блоком catch, а передається у зовнішній блок catch. Приклад:
Як бачите, винятокDivideByZeroException обробляється як у внутрішньому блоці, так і у зовнішньому.
Використання блоку finally
Іноді потрібно визначити кодовий блок, який виконуватиметься після виходу з блоку try/catch. Зокрема, виняткова ситуація може виникнути через помилку, що призводить до передчасного повернення з поточного методу. Але в цьому методі міг бути відкритий файл, який потрібно закрити, або встановлено мережне з'єднання, що вимагає розривання. Подібні ситуації нерідкі в програмуванні, і тому для їх вирішення в C# передбачений зручний спосіб: скористатися блокомfinally.
Використання блоку finally гарантує, що деякий набір операторів виконуватиметься завжди, незалежно від того, виник виняток (будь-якого типу) чи ні.
Щоб вказати кодовий блок, який повинен виконуватися після блоку try/catch, достатньо вставити блок finally в кінці послідовності операторів try/catch. Нижче наведено загальну форму спільного використання блоків try/catch і finally:
Блок буде виконуватися щоразу, коли відбувається вихід з блоку try/catch, незалежно від причин, які до цього призвели. Це означає, що якщо блок try завершується нормально або через виняток, то останнім виконується код, що визначається в блоці finally. Блок finally виконується і в тому випадку, якщо будь-який код у блоці try або у зв'язаних з ним блоках catch призводить до повернення з методу.
Давайте розглянемо приклад:
З точки зору синтаксису блок finally слідує після блоку try, і формально блоки catch для цього не потрібні. Отже, блок можна ввести безпосередньо після блоку try, опустивши блоки catch. У цьому випадку блок finally почне виконуватися відразу після виходу з блоку try,але винятки оброблятися нічого очікувати.