Визначений користувачем виняток - будь-який клас, визначений у власному коді, успадкований від System.Exception. На нього поширюються всі правила успадкування класів, але, крім того, компілятор і середовище виконання мови обробляють такі класи особливим чином, дозволяючи викидати та перехоплювати їхні екземпляри поза звичайним потоком керування, як описано у вправі exceptions. Визначені користувачем винятки можна використовувати точно так само, як винятки середовища виконання та бібліотеки базових класів Microsoft.
Це особливе ставлення стосується лише класів, успадкованих від Exception. Ми не можемо викидати екземпляри жодного іншого типу.
Визначені користувачем винятки часто використовують, щоб передати додаткову інформацію, як-от повідомлення та інші доречні дані, які мають стати доступними для процедур перехоплення. Потім цю інформацію можна записати в журнал, повідомити користувачеві або, можливо, використати під час повторної спроби. System.Exception має зручні члени даних і відповідні конструктори, щоб зберігати повідомлення та «внутрішній» виняток.
За домовленістю назви класів винятків закінчуються словом «Exception», наприклад MyTerribleException.
Хоча використання визначених користувачем винятків для обгортання та доповнення сторонніх винятків - часто вживаний прийом, загальна порада - не використовувати їх поза цим випадком надто щедро у власному коді. Це вважають антипатерном. Цей погляд не беззаперечний, і обидві сторони суперечки наведено в цьому дописі на Stack Exchange.
Ця стаття добре знайомить із визначеними користувачем винятками.
У своїх рекомендаціях щодо створення та викидання винятків команда .NET радить, щоб визначені користувачем винятки мали низку зручних конструкторів. Для більшості випадків підходить наведена нижче комбінація.
public class IncompleteExerciseException : System.Exception
{
public IncompleteExerciseException() : base() { }
public IncompleteExerciseException(string message) : base(message) { }
public IncompleteExerciseException(string message, System.Exception inner) : base(message, inner) { }
}