OOP Course
Сьогодні

Підрозділ 5.5

Створення класів винятків

Показує створення власних класів винятків, успадкування від Exception або ArgumentException та додавання власних властивостей.

5.5. Створення класів винятків

Вбудованих типів винятків (.NET надає їх понад 200) часто достатньо для технічних помилок. Але для доменних помилок — тих, що описують порушення бізнес-правил конкретної системи, — краще створювати власні класи винятків. Це дозволяє:

  • точно вказувати catch на потрібну категорію помилок
  • передавати у виняток додаткову доменну інформацію (ID пацієнта, некоректне значення)
  • будувати ієрархії винятків під свою предметну область

Мінімальний власний клас винятку

Будь-який клас, що успадковується від Exception, є повноцінним типом винятку. Мінімальна реалізація — конструктор із рядком повідомлення:

Конструктор передає рядок у базовий Exception через base(message). Тепер у catch можна точно вказати PatientException — і він не перехопить FormatException чи NullReferenceException.

Власні властивості у класі винятку

Справжня сила власних винятків — можливість зберігати доменні дані прямо в об'єкті помилки. Наприклад, некоректне значення, ID пацієнта, назву поля:

Властивість InvalidAge дозволяє обробнику отримати конкретне значення, що спричинило помилку — без парсингу рядка Message. Це зручно для логування та відображення деталей у UI.

Вибір базового класу

Власний виняток не обов'язково успадковувати від кореневого Exception. Якщо є більш підходящий вбудований тип — краще успадкувати від нього. Тоді catch (ArgumentException) також перехопить ваш клас:

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

Для складніших систем будують цілі ієрархії. Базовий доменний виняток об'єднує всі помилки предметної області, а конкретні типи уточнюють причину:

Ієрархія власних класів винятків клінічної системи

Ієрархія дає гнучкість: можна перехопити конкретний тип або всі помилки предметної області через базовий MedicalException.

Де оголошувати власні класи винятків

Кілька практичних правил:

  • Ім'я завжди завершується словом Exception: PatientAgeException, DiagnosisException
  • Клас розташовують поруч із тим, де він використовується (або в окремому файлі для великих проєктів)
  • Якщо виняток вказує на некоректний аргумент — успадковуйте від ArgumentException
  • Якщо виняток описує стан об'єкта, що не дозволяє операцію — від InvalidOperationException
  • Якщо помилка специфічна для вашої предметної області — від Exception або власного базового

Підсумок

  • Власний клас винятку — це звичайний клас, що успадковує Exception (або його похідний)
  • Мінімальна реалізація: конструктор з string message, що передає його в base(message)
  • Додаткові властивості зберігають доменний контекст: ID, некоректне значення, назву поля
  • Ієрархії дозволяють перехоплювати як конкретні типи, так і всю категорію помилок
  • Ім'я класу завжди закінчується на Exception
Розроблено Tomka Yurii · © 2026 ·