Якщо кидання System.Exception
вважається настільки поганим, чому б не булоException
робили abstract
в першу чергу?
Таким чином, не вдасться зателефонувати:
throw new Exception("Error occurred.");
Це призведе до використання похідних винятків, щоб надати більш детальну інформацію про помилку, що сталася.
Наприклад, коли я хочу надати власну ієрархію виключень для бібліотеки, я зазвичай оголошую абстрактний базовий клас для моїх винятків:
public abstract class CustomExceptionBase : Exception
{
/* some stuff here */
}
А потім якийсь похідний виняток із більш конкретною метою:
public class DerivedCustomException : CustomExceptionBase
{
/* some more specific stuff here */
}
Тоді при виклику будь-якого методу бібліотеки можна було б створити цей загальний блок спробувати / ловити, щоб безпосередньо знайти будь-яку помилку, що надходить із бібліотеки:
try
{
/* library calls here */
}
catch (CustomExceptionBase ex)
{
/* exception handling */
}
Це хороша практика?
Було б добре, якби Exception
зробити його абстрактним?
EDIT: Моя думка тут полягає в тому, що навіть якщо клас винятків позначений abstract
, ви все одно можете впізнати його в блоці "catch all". Зробити це абстрактним - це лише спосіб заборонити програмістам кидати "надширокий" виняток. Зазвичай, коли ви добровільно кидаєте виняток, ви повинні знати, що це за тип і чому це сталося. Таким чином, змушуючи викидати більш конкретний тип виключення.