Трехуровневая архитектура и исключения

Считалось, что хорошая практика имеет исключение для каждого уровня приложения (т.е. PresentationException, ServiceException, PersistenceException и т.д.). Но что, если мой сервисный уровень напрямую вызывает методы DAO (методы уровня сохранения) без дополнительных операций.

Вот так:

public class MyService {
   private IPersonDAO dao = new PersonDAO();

   public void deletePerson(int id) { 
      dao.deletePerson(id);
   }

}

Должен ли я обматывать этот вызов метода DAO блоком try-catch и реконструировать возможные исключения как ServiceException? Если каждый метод DAO выбрасывает только PersistenceException?

Ответ 1

Хорошо, что ваши исключения Dao не имеют отношения к уровню обслуживания, а уровень сервиса не имеет ничего общего с исключениями dao layer. Правильный подход состоял бы в том, чтобы поймать исключение dao и перестроить новое настраиваемое исключение на уровень сервиса.

Если вам нужно отлаживать исключения и вы хотите точную причину, вы можете использовать getCause() и getSuppressed().

Должен ли я обматывать этот вызов метода DAO блоком try-catch и реконструировать возможное исключение как ServiceException? Должен ли каждый метод DAO выбрасывать только PersistenceException?

--- > Да оберните его. Вы можете использовать другие исключения из уровня dao. См. Пример ниже:

public class MyDao {       

   public Entity getMyEntity(int id) throws ObjectNotFoundException, PersistenceException {
      try {
         // code to get Entity
         // if entity not found then 
         throw new ObjectNotFoundException("Entity with id : " + id + "Not found.");
      } catch(Exception e) { // you can catch the generic exception like HibernateException for hibernate
         throw new PersistenceException("error message", e);
      }
   }

}

Ответ 2

Да. Рекомендуется, по вашему мнению, иметь исключения для слоев; поскольку они могут определить, что проблема с точки зрения обслуживания, а не с БД.

Ответ 3

Да, вы должны обернуть эти исключения в любом случае, так как ваши клиенты уровня обслуживания в противном случае были бы вынуждены также работать с уровнем базы данных. Это усложнит ситуацию. Обратите внимание, что бит работы, который требуется выполнить на уровне обслуживания, малозначителен по сравнению с работой, которая потребуется для обработки исключений базы данных в слое над уровнем обслуживания.