Какова ваша иерархия пользовательских исключений? - PullRequest
3 голосов
/ 29 апреля 2010

Мой вопрос: как бы вы создали иерархию исключений в вашем приложении?

Разработка архитектуры приложения, с моей точки зрения, у нас может быть три типа исключений:

  • встроенный (например, InvalidOperationException)
  • настраиваемые внутренние системные ошибки (транзакция базы данных завершилась неудачей при фиксации, DbTransactionFailedException)
  • настраиваемые бизнес-исключения (BusinessRuleViolationException)

Иерархия классов:

  • Исключение
    • MyAppInternalException
      • DbTransactionFailedException
      • MyServerTimeoutException
      • ...
    • MyAppBusinessRuleViolationException
      • UsernameAlreadyExistsException
      • ...

, где будут отслеживаться только MyAppInternalException и MyAppBusinessRuleViolationException.

Ответы [ 2 ]

4 голосов
/ 29 апреля 2010

Реальная выгода от того, что тип исключения E наследуется от типа F, очевидно, когда E перехватывается модулем, который точно не знает, что такое E, но знает о F. Предполагая, что наследование имеет смысл, модуль имеет разумный надежда предпринять правильные корректирующие действия для исключения E, основываясь на том, что это своего рода исключение E.

Так что я склонен классифицировать исключения в зависимости от того, как они могут быть разумно обработаны. Например, типичный бизнес-процесс может использовать что-то вроде:

  • ConfigurationException - вещи, которые можно исправить, изменив файл конфигурации. Например. Конфигурация не может быть проанализирована или не соответствует. Надлежащий ответ - предупредить пользователя о необходимости исправить конфигурацию (если возможно, с полезными советами).
  • InfrastructureException - вещи, которые могут время от времени работать неправильно с ресурсами, находящимися вне контроля программы, такими как удаленные серверы и т. Д. Соответствующим ответом часто является отключение, повторная попытка после паузы и отказ в случае слишком большого количества сбоев.
  • DataException - вещи, которые неверны во входящих данных. Соответствующим ответом является регистрация жалобы (и, возможно, данных) и игнорирование этого сообщения.

Конечно, они могут быть разделены на подклассы. Но различия на этом уровне часто более полезны для модулей, которые ближе к источнику исключения. Если исключение всплывает на всем пути к основному модулю, то обычно есть только несколько возможных действий, и легче всего иметь взаимно-однозначное соответствие между этими действиями и операторами catch, на которые они отвечают.

2 голосов
/ 29 апреля 2010

"UsernameAlreadyExistsException"

Я думаю, что вы не должны использовать исключение для управления регулярным потоком вашего приложения. Т.е. это обычное экономическое обоснование, и оно не должно быть исключением. В правильном дизайне приложения нет исключения MyAppBusinessRuleViolationException.

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...