Реалізація обробників винятків у Visual C # (Sharp)

Оброблювач винятку реалізується за допомогою ключових слів try, catch і finally Суть реалізації обробника виключення в тому, що виключення, сгенерированное в певному блоці коду, буде перехоплено і оброблено Блок обробника виключення має таку структуру:

[Дію 1]

try {

[Дію 2]

}

catch (Exception exception) {

[Дію 3]

}

[Дію 4]

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

Якщо код в блоці try (дія 2 у прикладі) викликає інший метод, то на код викликається методу також поширюється захист блоку, навіть якщо код викли-

ваемого методу не захищений з точки зору цього методу На рис 54 показаний прес перехоплення і обробки виключень в такій ситуації

Рис 54 Перехоплення і обробка виключень при виклику методу захищеним блоком коду

Отже, захищений блок коду в дії 12 викликає метод, який має дію 21, дія 22 І дія 24 Дія 22 виполняетс я В контекст е захищеного блоку викликається методу, тому якщо воно згенерує виключив, то це виняток буде перехоплено і оброблено дією 23 Блок catch викликає коду, що містить дію 13, не знатиме про проіедшем виключення З точки зору викликається методу, дія 2 1 і дія 2 4 не є захищеними, але тк даний метод викликається з дії 12, яке Захищено блоком catch, що містить дію 13, то дія 2 1 і дія 24, по суті, захищені блоком catch викликає мода Якщо дія 2 . 1 або дія 24 згенерує виключення, то це іскленіе буде перехоплено і оброблено блоком catch викликає методу Даий приклад ілюструє наступне:

• процес перехоплення і обробки виключень може охоплювати кілька уроей викликів методів

• сгенерированное виключення буде перехоплено якомога ближче до місця, де воно відбулося

Не всі винятки обовязково обробляються обробником високого рівня більшість з них перехоплюються і обробляються обработчиками низького рівня Але іноді виняток з найнижчого рівня обробляються на найвищому рівні, як показано на рис 53, де виняток, сгенерированное на глибині декількох викликів, було перехоплено на найвищому рівні

У попередніх прикладах винятку викликалися неправильними діями коду Але виключення можна також згенерувати навмисно за допомогою наступної команди:

throw new Exception()

Ця дія також називається викиданням винятку При викиданні винятку створюється екземпляр типу, повязаний з базовим типом Exception Застосування ключового слова throw спільно з обєктом створює виняток, який може бути перехоплено і оброблено блоком catch вищого рівня

У більшості випадків викидання винятку екземпляр типу exception соается при викиданні У попередньому прикладі був використаний конструктор Exception () без параметрів, але є також і інші варіанти конструктора:

try {

throw new Exception(&quotException in action 24&quot)

&gt&nbsp

catch  (Exception thrown) {

throw new Exception(&quotException in action 2 has been caught &quot, thrown)

}

У першо м варіант е конструктора — Exception(&quotException in action 24) – ІС- користується строковий параметр, який передає текст, що описує причини виникнення винятку Це опис має бути зрозуміло людям, тому не використовуйте описів типу Помилка 168: щось не так . Другий варіант консуктора—Exception(&quotException in action 2 has been caught , thrown) – містить початкове виняток в якості додаткового параметра в новому викинутому виключення Таким чином, можна надати ще бее детальну інформацію про причини виключення

Даний код генерує висновок, подібний наступного:

Unhandled Exception: SystemException: Exception in action 2  has been caught

—&gt SystemException: Exception in action 24

Ці повідомлення надають ясну інформацію про те, де сталися виключений і де вони були оброблені Таким чином, у нас є повне представлена ​​про потік дій

ПРИМІТКА

Досвідчений програміст може помітити, що інформацію про потік виконання пррамми також можна отримати з дампа стека програми, і необовязково для цього викидати винятку Хоча в принципі це вірно, на практиці розшифровка даа стека 10 або 15 викликів методів приносить мало задоволення

Тепер розглянемо попередній код, модифікований для надання зменшеного обсягу інформації:

try

{

throw new Exception(&quotException in action 24&quot)

}

catch (Exception thrown)

{

throw new Exception(&quotException in action 2 has been caught&quot)

}

Наданий цим кодом висновок не дуже інформативний:

Unhandled Exception:  SystemException:  Exception in action 2 has been caught

Доступ до тексту повідомлення про помилку можна отримати за допомогою властивості

Message винятки:

try {

throw new Exception(&quotException in action 24&quot)

}

catch (Exception thrown)

{

ConsoleWriteLine(thrownMessage)

throw new Exception(&quotException in action 2 has been caught&quot)

}

У результаті буде виведено більше специфічне повідомлення, але не як частина поту винятків:

Exception in action 24

Unhandled Exception: SystemException: Exception in action 2 has been caught

HE ВИКОРИСТОВУЙТЕ повторюємо ПОВІДОМЛЕНЬ ПРО ПОМИЛКИ

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

Якщо з якихось причин один і той же текст необхідно використовувати в раих місцях, додайте до нього ідентифікатор контексту Наприклад, повідомлення про помилку завантаження файлу може видаватися при завантаженні файлу за допомогою графічкого діалогового вікна або при завантаженні з командного рядка Кожен з цих коекстов слід вказати за допомогою додаткової інформації, доданої до самого повідомленням про помилку завантаження файлу, подібно до того, як було проіллтріровано в попередньому коді при перехопленні виключення в дії 2

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*