Підрозділ 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. Це корисно для логування: ми отримуємо і конкретний тип, і загальні властивості.
Ієрархія типів винятків

У .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
- Конкретніший тип — раніше:
FormatExceptionпередException - Загальний
Exception— завжди останнім: інакше він перехопить усе, і специфічні блоки стануть недосяжним кодом — компілятор видасть помилку - Похідний клас — перед базовим: якщо
ArgumentOutOfRangeException(похідний відArgumentException) стоїть післяArgumentException— він ніколи не спрацює
Підсумок
System.Exception— базовий клас для всіх винятків, міститьMessage,StackTrace,InnerException,TargetSite- Кожен виняток — це об'єкт конкретного класу в ієрархії
Exception - Блоки
catchперевіряються зверху вниз; спрацьовує перший відповідний - Загальний
catch (Exception ex)— страхувальний мережа, завжди останній - Виняток зупиняє виконання
tryодразу; код після місця помилки не виконується