2010-04-29 3 views
3

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

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

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

Cl Иерархия задница:

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

где только MyAppInternalException & MyAppBusinessRuleViolationException будет пойманной.

+0

Это весьма субъективным, рекомендую редактировать свой вопрос и помечая «сообщество вики» флажок (чтобы не иметь этот вопрос закрыта). –

ответ

4

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

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

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

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

2

«UsernameAlreadyExistsException»

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

С уважением,

Смежные вопросы