Реальное преимущество типа исключения E, наследуемого от типа F, по-видимому, когда E попадает в модуль, который конкретно не знает, что такое E, но знает о F. Предполагая, что наследование имеет смысл, модуль имеет разумная надежда на то, чтобы предпринять правильные корректирующие действия для исключения E, исходя из того, что это было своего рода исключение E.
Поэтому я склоняюсь к исключениям класса в соответствии с тем, как их разумно обрабатывать. Например, типичный бизнес-процесс может использовать что-то вроде:
- ConfigurationException - вещи, которые могут быть исправлены путем изменения конфигурационного файла. Например. config не может быть проанализирован или несовместим. Соответствующим ответом является предупреждение пользователю исправить конфигурацию (с полезными подсказками, если это возможно).
- InfrastructureException - вещи, которые могут спорадически ошибаться с ресурсами, находящимися вне контроля программы, такими как удаленные серверы и т. Д. Соответствующий ответ часто отключается и повторяет попытку после паузы и отказывается, если слишком много сбоев.
- DataException - что-то не так во входящих данных. Соответствующим ответом является регистрация жалобы (и, возможно, данных) и игнорирование этого сообщения.
Это могут быть подклассы, конечно. Но различия на этом уровне часто более полезны для модулей, ближе к источнику исключения.Если исключение пузырится до основного модуля, тогда обычно существует только несколько возможных действий, и проще всего иметь взаимно однозначное соответствие между этими действиями и операциями catch
, на которые они отвечают.
Это весьма субъективным, рекомендую редактировать свой вопрос и помечая «сообщество вики» флажок (чтобы не иметь этот вопрос закрыта). –