OOP Course
Сьогодні

Підрозділ 5.3

Типи винятків. Клас Exception

Описує базовий клас Exception, його властивості, спеціалізовані типи винятків і порядок розміщення catch-блоків.

5.3. Типи винятків. Клас Exception

Кожен виняток у C# — це об'єкт. Усі класи винятків успадковуються від базового класу System.Exception. Це означає, що кожен виняток гарантовано містить набір стандартних властивостей з інформацією про помилку, а catch (Exception ex) здатен перехопити будь-який виняток у системі.

Клас Exception та його властивості

System.Exception визначає кілька ключових властивостей:

Властивість Тип Що містить
Message string Текстовий опис помилки
StackTrace string Стек викликів на момент винятку
InnerException Exception? Виняток, що спричинив поточний (якщо є)
TargetSite MethodBase? Метод, у якому виник виняток
Source string? Назва збірки або об'єкта-джерела

Властивість ex.GetType().Name показує реальний тип винятку — тут це буде FormatException, хоча перехоплюємо через базовий Exception. Це корисно для логування: ми отримуємо і конкретний тип, і загальні властивості.

Ієрархія типів винятків

Ієрархія класу Exception та поширені похідні типи

У .NET існує багато спеціалізованих класів винятків. Кожен відповідає за конкретну категорію помилок. Найпоширеніші:

Тип Коли виникає
FormatException Некоректний формат рядка при Parse
OverflowException Переповнення числового типу
DivideByZeroException Ділення цілого числа на нуль
IndexOutOfRangeException Вихід за межі масиву або рядка
NullReferenceException Звернення до null-посилання
InvalidCastException Неприпустиме явне перетворення типів
ArgumentException Некоректний аргумент методу
ArgumentOutOfRangeException Аргумент поза допустимим діапазоном

Усі вони є похідними від Exception, тому catch (Exception ex) перехопить кожен із них.

Кілька блоків catch для різних типів

Якщо у блоці try можуть виникнути різні типи помилок, варто обробляти їх окремо — це дозволяє давати більш точні повідомлення та вживати відповідних заходів:

CLR перевіряє блоки catch зверху вниз і виконує перший, тип якого відповідає типу винятку. Після цього решта блоків ігнорується.

Один виняток зупиняє виконання try

Важливо розуміти: як тільки в try виникає виняток, всі рядки після нього не виконуються. CLR негайно передає керування відповідному catch:

Рядок "Всі записи оброблено." ніколи не виведеться, якщо виняток виник до кінця циклу. Рядок після всього блоку try...catch"Програма завершила роботу." — виведеться завжди, оскільки виняток було перехоплено.

Необроблений виняток аварійно завершує програму

Якщо тип винятку не відповідає жодному catch — виняток не перехоплюється. CLR пробуджує обробники вище по стеку, і якщо ніхто не перехопив — програма завершується аварійно:

Блок catch (Exception ex) тут виступає «страхувальним мережем» — він обробляє будь-який виняток, якого не перехопили конкретніші блоки.

Правила порядку блоків catch

  1. Конкретніший тип — раніше: FormatException перед Exception
  2. Загальний Exception — завжди останнім: інакше він перехопить усе, і специфічні блоки стануть недосяжним кодом — компілятор видасть помилку
  3. Похідний клас — перед базовим: якщо ArgumentOutOfRangeException (похідний від ArgumentException) стоїть після ArgumentException — він ніколи не спрацює

Підсумок

  • System.Exception — базовий клас для всіх винятків, містить Message, StackTrace, InnerException, TargetSite
  • Кожен виняток — це об'єкт конкретного класу в ієрархії Exception
  • Блоки catch перевіряються зверху вниз; спрацьовує перший відповідний
  • Загальний catch (Exception ex) — страхувальний мережа, завжди останній
  • Виняток зупиняє виконання try одразу; код після місця помилки не виконується
Розроблено Tomka Yurii · © 2026 ·