Обработка Dao-исключений на уровне сервиса - PullRequest
21 голосов
/ 13 февраля 2012

Если мой слой Dao генерирует определенные исключения Dao, то вызывает ли их обработка в моем слое обслуживания утечку проблем?Если да, то я должен сделать исключения общими и независимыми от какого-либо уровня для их устранения, или есть какой-то другой способ?

Тот же вопрос применим к исключениям обработки уровня пользовательского интерфейса, создаваемым уровнем обслуживания.

Ответы [ 4 ]

32 голосов
/ 13 февраля 2012

Когда мы создаем многоуровневое приложение, всегда есть пользовательский слой и другой используемый слой. В этом случае уровень пользовательского интерфейса -> использует уровень службы -> использует уровень DAO.

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

Например, скажем, если есть какая-либо ошибка на стороне базы данных (нарушение ограничения и т. Д.), Оберните это в PersistentException и позвольте сервисному уровню обработать это (как передать это на уровень пользовательского интерфейса универсальным способом). )

Теперь, поскольку интеграция между уровнем обслуживания и уровнем DAO * договорная (на основе интерфейса), уровень DAO может изменять реализацию на что угодно, пока он подчиняется интерфейсный контракт . Таким образом, если вы измените реализацию, которая генерирует некоторые новые исключения, эти новые исключения могут быть включены в PersistentException и Сервисный уровень остается неизменным .

9 голосов
/ 13 февраля 2012

Да. Хорошая идея - создавать свои собственные независимые исключения для каждого слоя.

Например, если вы используете конкретную реализацию DAO, вам следует связать исключение, специфичное для реализации, с вашим собственным универсальным исключением и выбросить его на уровень обслуживания.

Тем не менее, вы должны быть внимательны при создании собственной иерархии исключений, чтобы она не накладывала затрат на разработку приложений, а также позволяла поддерживать информацию, требуемую на уровне обслуживания. В большинстве случаев для этого достаточно пользовательских кодов ошибок с общим исключением.

Нечто подобное можно использовать для имитации исключения, связанного с реализацией, и выбросить его на сервисный уровень.

class AppDAOException extends Exception {
    public final static int _FAIL_TO_INSERT = 1;
    public final static int _UPDATE_FAILED = 2;
    public final static int _SQL_ERROR = 3;
    private int errorCode;
    public AppDAOException(int errorCode) {
        this.errorCode = errorCode;
    }
    public getErrorCode() {
        return errorCode;
    }
}

Бросок от реализации DAO:

try {
   //code here
} catch (some.impl.SQLSyntaxException e) {
   throw new AppDAOException (AppDAOException._SQL_ERROR );
}

Об утечке концерна: Возможно, вы не захотите, чтобы уровень обслуживания беспокоился обо всех исключениях, таких как:

} catch(NoRowExistsException e) {
    return null;
} finally {
   //release resources
}

Таким образом, вызов должен приниматься в зависимости от потребностей приложения.

6 голосов
/ 28 марта 2012

Ваш уровень DAO уже просачивается в уровень обслуживания, когда вы выполняете такие операции, как:

userDAO.persist(user);

Исключения, являющиеся частью API так же, как и операции, должны рассматриваться аналогично.

try {
    userDAO.persist(user);
} catch (DAOException e) {
    // looks fine to me
}

Утечка может произойти с исключениями времени выполнения или при перебрасывании исключений

try {
    userDAO.persist(user);
} catch (SQLException e) {
    // sql implementation exposed
}

Но даже это звучит лучше, чем "независимые от слоя" исключения

0 голосов
/ 13 февраля 2012

Хороший вопрос .. !!Хорошим подходом является обработка исключений на уровне пользовательского интерфейса (например, на уровне действий, если вы используете структуры). Создание общих исключений не является хорошим способом решения этой проблемы.Однако каждый слой должен иметь свои особые исключения как общие.например, слой DAO может иметь настраиваемые обработчики исключений, такие как DavaSavingException, IOException и т. д.

Таким образом, подход заключается в том, чтобы выбросить исключение из DAO на уровень обслуживания и снова выбросить его на уровень пользовательского интерфейса и перехватить в определенных классах интерфейса пользователя.*

Однако в зависимости от ваших требований / потребностей все слишком дипломатично.

...