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

Хорошей практикой считается исключение для каждого уровня приложения (т.е. 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?

3 ответа

Решение

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

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

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

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

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);
      }
   }

}

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

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

Другие вопросы по тегам