Это действительно зависит от ваших предпочтений регистрации. Например, у вашего уровня доступа к базе данных может быть метод, который принимает SQL
запрос в качестве String
в качестве аргумента и выполняет его в БД. Теперь вы можете записать любой SQLException
в этом слое, а затем обернуть SQLException
пользовательским исключением [например, DatabaseException
], а затем повторно выбросить его в родительский слой. Вы также можете инкапсулировать некоторые дополнительные действия, такие как boolean shouldRetry
, в ваш DatabaseException
объект, чтобы родительский уровень мог повторить операцию снова. Регистрация SQLException
сразу же позволит вам легче отладить проблему позже.
EDIT:
Этот подход имеет больше смысла, когда ваш родительский слой выполняет операцию, которая может вызвать более одного вида исключений. Например, в приведенном выше сценарии метод, который принимает запрос SQL
, может также выдать InvalidHostException
, если менеджер базы данных недоступен, или ConnectionRefusedException
, если менеджер базы данных отклонил соединение из-за перегрузки. В таком случае вы можете записать исключение, а затем обернуть его более общим DatabaseException
. Также, если метод выдает ConnectionRefusedException
, вы можете установить для переменной shouldRetry
значение true; в то время как то же самое будет ложным для InvalidHostException
. Это позволяет API вызывающей программы через некоторое время снова попытаться вызвать метод, если для shouldRetry
установлено значение true.
ПРИМЕЧАНИЕ: кроме SQLException
, все остальное - творение моего воображения. : -)