Главный недостаток варианта 2 (общее исключение + enum) заключается в том, что вы теряете некоторые полезности проверенных исключений. Метод в значительной степени должен просто сказать: «что-то, связанное с фреймворком, может пойти не так»:
public void foo()
throws MyFrameworkException
... вместо "x или y может пойти не так":
public void foo()
throws SomethingWentWrongException, SomethingElseWentWrongException
Это означает, что функция, которая, возможно, должна обрабатывать одно исключение фреймворка, должна быть готова обработать любые из них, тогда как, если вы конкретны, функция должна быть готова только для обработки исключений брошенный методами структуры, которые это вызывает.
Так что для меня иерархия, такая как Вариант 1 (она не должна быть такой плоской, если структура сама себя предлагает) - это путь. Тем не менее, есть люди, которым вообще не нравятся проверенные исключения, и для них я подозреваю, что вышеизложенное не является убедительным аргументом. : -)
Редактировать И поймав точку Даффимо: я предположил, что вы говорили об исключениях, которые вы действительно должны были создать. Абсолютно выбрасывайте стандартные исключения везде, где это имеет смысл (что почти везде). Например, не создавайте свой собственный MyFrameworkIllegalArgumentException
, просто используйте IllegalArgumentException
(или его различные подклассы).