Исключениями в Java являются обычные объекты, которые наследуются от Throwable. Решите, хотите ли вы, чтобы ваше исключение было проверено (т. Е. Компилятор проверяет предложение throws
в сигнатурах методов, которые могут их выбросить), или нет. Если вы хотите, чтобы ваши пользовательские исключения проверялись, наследуйте от Exception, если нет, от RuntimeException. Вы также можете расширить Error
для неустранимых исключений, которые должны привести к закрытию вашего приложения.
При написании ваших собственных исключений сконцентрируйтесь на том, чтобы сделать их описательными, то есть, если ваше исключение выдается, вы должны иметь общее представление о том, что пошло не так, просто глядя на сообщение об исключении и его трассировку стека. Конструкторы исключений, принимающие сообщение в качестве параметра, являются вашими друзьями. И Exception
, и RuntimeException
предоставляют необходимые конструкторы, поэтому ваши конструкторы в простейшем случае будут просто вызывать их.
Не забудьте держать свои исключения на том же уровне абстракции, что и методы, которые их выдают. Если, например, у вас есть общий интерфейс для доступа к объектам домена, который скрывает детали реализации конкретной базы данных, в случае ошибок вы не должны просто перебрасывать исключения, генерируемые соединением базы данных. Вы можете обернуть эти исключения в свой собственный класс исключений с правильным уровнем абстракции. Как и прежде, Exception
и RuntimeException
уже имеют конструкторы для этого.
Не может помочь вам в планировании иерархии исключений в вашем проекте и отдельных классах, так как вы не предоставили никаких подробностей об этом. Пожалуйста, обновите ваш вопрос с более конкретным описанием ваших проектов.