Если это большой проект, я склонен иметь базовый класс исключений, который получается из System.Exception
для всех исключений, специфичных для домена. Таким образом, если имя продукта - «Foo», то все исключения происходят из «FooException».
Я не называю это лучшей практикой, и я не удивлюсь, если некоторые люди настаивают на том, что это плохая практика, но в моей книге есть несколько преимуществ:
- Если вы когда-нибудь захотите объединить проекты или написать гибридные приложения, наличие этого класса в корне иерархии ясно говорит вам, в какой подсистеме есть правило или предположение, которое было нарушено. Облегчает исследование сообщения об ошибке в какой-то большой оркестровке.
- Это совершенно недвусмысленный стандарт, и разработчикам никогда не придется беспокоиться о таких вещах, как наследование от
Exception
или DbException
.
- Упрощает добавление глобальной информации о проекте в дерево исключений, если вам когда-либо понадобится (например, веб-приложение / служба может захотеть включить информацию о текущем контексте безопасности или узле сервера, на котором произошло исключение) на). Не то чтобы вам это всегда было нужно или нужно, но бывают случаи, когда вы можете.
Если у вас есть несколько крупных подпроектов (скажем, Foo.Core
для модели домена, Foo.Data
для уровня данных, Foo.Services
для бизнес-логики и Foo.UI
для модели представления), тогда я мог бы также создайте корневое исключение для каждого из FooException
. В этом конкретном случае это будет FooDataException
, и каждое исключение, происходящее в DAL (например, DuplicateEntryException
), происходит из этого. У вас также были бы ваши FooServiceException
и FooUIException
и все остальное.
Хотя это просто мнение. Я не думаю, что есть правильный или неправильный ответ.
Редактировать: За исключением ApplicationException
, который является неправильным ответом!